用于最大距离和MongoDB的单位是什么?

36

我正在学习 MongoDB 和地理空间搜索。基本上,我想让用户能够查询距离他们当前位置一定范围内拍摄的文档(图片)。所以,如果用户正在寻找所有在 1 公里范围内拍摄的图像,我尝试使用下面的示例,但不知道该如何设置 maxdistance 值。

db.places.find({ loc : { $near : [50,50] , $maxDistance : 5 }})

我的问题是,如果我想在1公里的半径范围内搜索文档,我应该将maxdistance设置为多少?

我完全被卡住了。

3个回答

70
为了在MongoDB中使用带有km边界的$near查询,您需要将半径值转换为km。默认情况下,MongoDB $near接受$maxDistance作为半径。使用km时,请通过111.12(一个度约为111.12公里)将距离转换为km,或者在使用度时保持距离不变。
对于您的问题,“如果我正在搜索1公里半径内的文档,我应该将maxdistance设置为多少?”,您可以使用此代码。
   db.places.find( { loc : { $near : [50,50] , $maxDistance : 1/111.12 } } )

我在这里详细回答了如何使用mongo地理空间特性。你可以查看。


好的,谢谢!$near 和 $nearSphere 有什么区别? - Jonathan Clark
13
$near假设一个平坦地球的理想模型,这意味着纬度(y)和经度(x)的一度弧长在任何地方都代表相同的距离。因此,您需要将半径乘以111或69才能得到结果。但是$nearSphere需要将半径乘以(6371公里或3959英里)才能使其正常工作... 您可以在这里阅读更多内容。 - RameshVel
能否查询一个分数? - Karl
3
这里的单位在文档中有提到。找了一段时间才找到... http://docs.mongodb.org/manual/reference/operator/maxDistance/ 感谢转换,@RameshVel!更精确的转换在这里:http://www.chemical-ecology.net/java/lat-long.htm 显示每度111.11999965975954公里(我在米级别工作,所以准确性很重要)。 - ericsoco
我应该补充说明,随着你远离赤道,经度的值会发生变化。这很有道理... - ericsoco
这里有一个问题,这种方法似乎不起作用:https://dev59.com/63jZa4cB1Zd3GeqPbTYl - Ron

16

自 MongoDB 版本2.4起,您可以直接将半径以米为单位作为$maxDistance的值指定,如下所示:

db.<collection>.find({loc: {$near : 
                               {$geometry : 
                                   {
                                    type: 'Point', 
                                    coordinates: [<longitude> , <latitude>]       
                                   }
                               }, 
                               $maxDistance: 10*100 
                           }
                     }); 

4
这取决于索引。如果索引是“2d”,则这样做行不通,因为2d索引假定为“弧度格式”。另一方面,如果索引是“2dsphere”,你是正确的。:-) 文档链接:https://docs.mongodb.com/manual/reference/operator/query/near/#query-on-legacy-coordinates - qualbeen
这里,最大距离是以米还是千米为单位? - Mijanur Rahman

0
在最近的版本中,我正在使用Spring和Mongo 4.0.5。重要的是索引类型和位置数据类型。我正在使用2dsphere、org.springframework.data.mongodb.core.geo.GeoJsonPoint。随后它会生成相应的带有以米为单位的距离的几何形状的mongo查询。
{ "location" : { "$nearSphere" : { "$geometry" : { "type" : "Point", "coordinates" : [18.341772, 43.834183] }, "$maxDistance" : 331.0 } 

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