【问题标题】:How to use $geoNear with aggregate in PyMongo如何在 PyMongo 中使用 $geoNear 和聚合
【发布时间】:2017-06-16 07:39:24
【问题描述】:

假设您有一个具有以下结构的集合:

{
    "_id": ObjectId("543f1ec50204444c53ba39a0"), 
    "request_ip": "61.111.36.11", 
    "owner": ObjectId("543f227c0204444c53ba4b28"),
    "loc": [-116.199, 43.6186]
}

其中loc 包含由其纬度和经度分别定义的地理点的位置。

好吧,您需要的是根据计算出的位置与另一个给定点之间的距离来查找集合中的文档。

在这种情况下,使用aggregate () 函数:

cercanos = collection.aggregate(
[{ 
    "$geoNear": {
        "near": [ 52.15077 , 9.95112 ],
        "distanceField": "dist", 
        "spherical": True,
        "limit":2
    }
}])

当您按照 MongoDB 文档 (https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear) 操作时,一切似乎都井然有序,但是当您运行时会出现几个错误:

  Traceback (most recent call last):
  File "E:\Documents\EclipseProjects\Bonus8\src\pru.py", line 154, in <module>
    "spherical": True,
  File "D:\Python\lib\site-packages\pymongo\collection.py", line 1870, in aggregate
    collation=collation)
  File "D:\Python\lib\site-packages\pymongo\collection.py", line 232, in _command
    collation=collation)
  File "D:\Python\lib\site-packages\pymongo\pool.py", line 419, in command
    collation=collation)
  File "D:\Python\lib\site-packages\pymongo\network.py", line 116, in command
    parse_write_concern_error=parse_write_concern_error)
  File "D:\Python\lib\site-packages\pymongo\helpers.py", line 210, in _check_command_response
    raise OperationFailure(msg % errmsg, code, response)
pymongo.errors.OperationFailure: geoNear command failed: { ok: 0.0, errmsg: "no geo indices for geoNear" }

【问题讨论】:

  • $geoNear 从手册页引用:“集合必须有一个geospatial index。” 这也有一个很好的链接到描述索引的另一个手册页他们自己。没有什么“特定于外壳”的。
  • @NeilLunn,您不能直接在 PyMongo 中使用参考手册示例。这正是我所解释的。
  • 这是一个聚合管道阶段。它没有任何关于 PyMongo 的具体内容,并且实际上在所有语言中都完全相同。也许这就是你需要了解的。

标签: python mongodb pymongo


【解决方案1】:

会发生什么:

问题在于 MongoDB 参考手册提供的使用示例特定于您的控制台中的独占执行 (mongo shell)。这会导致 PyMongo 环境发生重大变化,例如必须引用变量。

可能的解决方案:

创建地理空间索引:

from pymongo import GEO2D
collection.create_index([("loc", GEO2D)])

这指定了一个二维地理空间索引并解决了之前出现的错误。

输出:

{
    "_id": ObjectId("543f1ec50204444c53ba39a0"), 
    "request_ip": "61.111.36.11", 
    "owner": ObjectId("543f227c0204444c53ba4b28"),
    "loc": [-116.199, 43.6186]
    "dist": 2.18848713
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 2023-03-21
    • 2018-08-25
    • 2014-08-09
    • 1970-01-01
    • 2013-04-29
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多