【问题标题】:MongoDB/PyMongo geospatial query: distance of documents from a pointMongoDB/PyMongo 地理空间查询:文档到点的距离
【发布时间】:2013-09-21 09:58:43
【问题描述】:

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

升级的原因之一是新版本的 MongoDB 能够计算并返回文档与地理空间查询中心的距离(包括正确的坐标)as explained here

到目前为止,我执行了以下查询:

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

其中 LON、LAT 和 Radius 是正确的数字。然后,我以编程方式计算返回的每个文档到中心的距离。

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

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

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

现在正确计算了 RADIUS 的位置(半径以 km / 6371 为单位),但我得到的结果与旧查询相同。

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

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

【问题讨论】:

    标签: mongodb geospatial pymongo


    【解决方案1】:

    尝试在聚合框架中使用 $geoNear 命令。 $geoNear 文档在这里:

    http://docs.mongodb.org/manual/reference/aggregation/geoNear/

    您的查询最终将如下所示:

    db.collection.aggregate([{$geoNear:{near:[LON,LAT],distanceField:"distance",maxDistance:RADIUS,spherical:true}}])
    

    生成的文档将有一个名为“距离”的字段,其中包含计算值。希望对您有所帮助。

    【讨论】:

    • 谢谢。 “spherical:true”是否意味着索引也应该更改为 2dsphere ?
    • spherical:true 指定在球面上进行半径计算,而不是在平面上。如果索引的类型为“2dsphere”,则必须使用spherical:true。如果索引是“2d”类型,那么您可以使用球面:真或球面:假。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2015-06-07
    • 2015-07-16
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多