Mongo中$center和$centerSphere有什么区别?

4

目前,我们正在使用$centerSphere来查找附近的城市。例如,在美国德克萨斯州的Bee Cave地区,$centerSphere在半径为30公里(按照文档,已转换为弧度)内正确地找到了唯一的城市奥斯汀。现在,对于斐济的Lautoka市(Lat:-17.6169618,Long:177.4504609),它会出现错误“球面距离需要(未实现)包裹”。这是第一个问题:这个错误是什么意思?

我们尝试通过使用$center来实现相同的功能。我知道我们需要给出以英里为单位的距离,而不是弧度。实施后,对于Bee Cave,我得到了美国城市,它们距离非常遥远。例如,阿尔布开尔克。我无法理解为什么即使按照Mongo文档正确操作,仍然会出现这些城市。

我正在使用以下查询(针对德克萨斯州的Bee Cave):

db.places.find{
   "geo": {
      $geoWithin: { $center: [ [ -97.9524, 30.3061 ] , 18.64 ] }
   }
}
1个回答

5

$centerSphere无法处理大距离,特别是如果必须绕过极点,请参阅此JIRA工单

关于$geoWithin,它不接受以英里为单位的距离,而是根据坐标系使用的单位测量圆的半径,因此经度和纬度如文档所述。这会导致一个非常大的边界框,包括阿尔布开克市

bounding box

您可以使用$near,该操作符允许指定以米为单位的半径。例如,如果您将此用作测试数据:

db.places.insert( {
   name: "Bee Cave, Texas",
   location: { type: "Point", coordinates: [ -97.9524, 30.3061 ]  }
} );
db.places.insert( {
   name: "Austin, Texas",
   location: { type: "Point", coordinates: [ -97.654724, 30.210768 ]  }
} );
db.places.insert( {
   name: "Albuquerque",
   location: { type: "Point", coordinates: [ -106.621216, 35.113281 ]  }
} );

db.places.createIndex( { location: "2dsphere" } )

你可以使用因子1609.344将英里转换为米,写出以下查询:
db.places.find(
   {
     location:
       { $near:
          {
            $geometry: { type: "Point",  coordinates: [-97.9524, 30.3061 ] },
            $maxDistance: 20*1609.344 
          }
       }
   }
)

这个查询返回的结果既包括Bee Cave, TX也包括Austin, TX:

{
   "_id":ObjectId("5a7190124f0cd7075d349bbc"),
   "name":"Bee Cave, Texas",
   "location":{
      "type":"Point",
      "coordinates":[
         -97.9524,
         30.3061
      ]
   }
}{
   "_id":ObjectId("5a7190124f0cd7075d349bbd"),
   "name":"Austin, Texas",
   "location":{
      "type":"Point",
      "coordinates":[
         -97.654724,
         30.210768
      ]
   }
}

1
那么当涉及到geoWithin时,我必须以弧度的形式给出距离吗?在$center的文档中没有明确说明。至少对于$centerSphere,他们已经明确指定我们必须使用弧度。我仍然感到困惑。 - Mithil Bhoras
1
这是关于 $center 写的内容:“以下示例查询返回所有具有坐标存在于以 [ -74,40.74 ] 为中心且半径为10 的圆圈内的文档。” 它只说了半径为10 ,没有任何单位的提及。 - Mithil Bhoras
圆的半径,以坐标系使用的单位测量。 - Alex
这是您的纬度和经度,并且与您的结果相匹配(从阿尔布开克到德克萨斯州比洞)。 - Alex
我已经更新了我的答案,展示了如何使用$near - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接