Python 如何在PyMongo中将$geoNear与聚合一起使用
假设您有一个具有以下结构的集合:Python 如何在PyMongo中将$geoNear与聚合一起使用,python,mongodb,pymongo,Python,Mongodb,Pymongo,假设您有一个具有以下结构的集合: { "_id": ObjectId("543f1ec50204444c53ba39a0"), "request_ip": "61.111.36.11", "owner": ObjectId("543f227c0204444c53ba4b28"), "loc": [-116.199, 43.6186] } 其中,loc包含由其纬度和经度分别定义的地理点的位置 那么,您需要的是根据您的位置与另一个给定点之间计算的距离来查找集合中
{
"_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文档()时,一切似乎都井然有序,但是当您运行时,会出现几个错误:
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" }
回溯(最近一次呼叫最后一次):
文件“E:\Documents\EclipseProjects\Bonus8\src\pru.py”,第154行,在
“球形”:正确,
文件“D:\Python\lib\site packages\pymongo\collection.py”,第1870行,总计
排序规则=排序规则)
文件“D:\Python\lib\site packages\pymongo\collection.py”,第232行,在_命令中
排序规则=排序规则)
命令中第419行的文件“D:\Python\lib\site packages\pymongo\pool.py”
排序规则=排序规则)
命令中第116行的文件“D:\Python\lib\site packages\pymongo\network.py”
parse_write_concern_error=parse_write_concern_error)
文件“D:\Python\lib\site packages\pymongo\helpers.py”,第210行,在\u check\u命令\u响应中
提升操作失败(消息%errmsg,代码,响应)
pymongo.errors.OperationFailure:geoNear命令失败:{ok:0.0,errmsg:“没有geoNear的地理索引”}
发生了什么:
{
"_id": ObjectId("543f1ec50204444c53ba39a0"),
"request_ip": "61.111.36.11",
"owner": ObjectId("543f227c0204444c53ba4b28"),
"loc": [-116.199, 43.6186]
"dist": 2.18848713
}
问题在于MongoDB参考手册提供的使用示例特定于控制台中的独占执行(MongoShell
)。这会导致在PyMongo环境中进行重大更改,例如必须引用变量
可能的解决方案:
{
"_id": ObjectId("543f1ec50204444c53ba39a0"),
"request_ip": "61.111.36.11",
"owner": ObjectId("543f227c0204444c53ba4b28"),
"loc": [-116.199, 43.6186]
"dist": 2.18848713
}
创建地理空间索引:
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
}
引用手册页面中的话:“集合必须有一个。”这同样有一个很好的链接到另一个手册页面,描述索引本身。没有“特定于shell”的内容。@NeilLunn,您不能直接在PyMongo中使用参考手册示例。这正是我要解释的。这是一个聚合管道阶段。它没有任何PyMongo特定的功能,实际上在所有语言中都是一样的。也许这就是你需要了解的。