MongoDB/PyMongo地理空间查询:文档距离点的距离

3
我最近将我的MongoDB从2.2.1版本升级到了2.4.6版本,并升级了pymongo到2.6.2版本。

升级的原因之一是新版本MongoDB具备计算并返回文档(包括适当坐标)距离地理查询中心的距离的能力,详情请参见此处

目前我执行以下查询:
db.collection.find({"loc": {"$within": {"$center": [[LON, LAT], RADIUS]}}})

LON、LAT和半径都是适当的数字,我通过编程计算每个返回文档与中心的距离。

现在我正在尝试让MongoDB代表我进行距离计算,因为相对于我的代码,它更高效。

我现在正在尝试以下内容:

db.collection.find({"loc": {"$geoWithin": {"$centerSphere": [[LON, LAT], RADIUS]}}})

其中RADIUS现在被正确计算(半径以km / 6371表示),但我得到的结果与旧查询相同。

为了获得每个文档返回的额外字段“dis”,我应该如何更改新的查询?

地理空间索引是2D的,根据文档应该可以工作,但如果需要,我可以将其更改为2dsphere。有人有好的建议吗?

1个回答

3
尝试在聚合框架中使用$geoNear命令。$geoNear的文档在这里:http://docs.mongodb.org/manual/reference/aggregation/geoNear/
你的查询将类似于:
db.collection.aggregate([{$geoNear:{near:[LON,LAT],distanceField:"distance",maxDistance:RADIUS,spherical:true}}])

并且生成的文档将会有一个名为“distance”的字段,其中包含计算出的值。希望这能帮到你。


“spherical:true”是否意味着索引也应更改为2dsphere?谢谢。 - user1981924
1
spherical:true指定在球面上进行半径计算,而不是在平面上进行计算。如果索引的类型为“2dsphere”,则必须使用spherical:true。如果索引的类型为“2d”,则可以使用spherical:true或spherical:false。 - jribnik

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