【发布时间】: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 的具体内容,并且实际上在所有语言中都完全相同。也许这就是你需要了解的。