麻烦mongoengine和地理空间查询
问题描述:
我遇到了麻烦Mongoengine的地理空间查询工作。我有一个User
mongoengine类与一个叫cached.geoLoc
场这是mongoengine型PointField()
的。如果我打电话麻烦mongoengine和地理空间查询
User.objects(cached__geoLoc__near=[100,100])
然后它返回答案。但是,如果我想结果限制在有限的范围,并呼吁:
User.objects(cached__geoLoc__near=[100,100], cached__geoLoc__max_distance=1000)
然后我得到一个错误:pymongo.errors.OperationFailure: database error: Can't canonicalize query: BadValue geo near accepts just one argument when querying for a GeoJSON point. Extra field found: $maxDistance: 1000
我使用MongoEngine版本0.8.7和MongoDB 2.4可能是什么问题?
答
我在这里尖叫错误。
如果我试试这一套类似的数据与类似以下内容:
class Geo(Document):
loc = PointField()
result = Geo.objects(loc__near=[3,6], loc__max_distance=1000)
然后发给的MongoDB结果查询是这样的:
{
"loc" : {
"$near" : {
"$geometry" : {
"type" : "Point",
"coordinates" : [ 3, 6 ]
}
},
"$maxDistance" : 1000
}
}
的问题作为$maxDistance
在错误的地方。
使用原始pymongo驱动程序的命令发出正确的查询表单工作正常:
result = Geo._get_collection().find({
"loc": {
"$near": {
"$geometry": {
"type": "Point",
"coordinates": [3,6]
},
"$maxDistance": 1000
}
}
}):
而且主要是因为我们正在发行的$maxDistance
修改的地方应该是它是$near
操作参数“中”。
文件中的错误。但是,您可以使用直接语法来获得结果作为解决方法,直到出现修复。
好吧,我将提交一个错误。但是与此同时,你知道是否可以使用直接语法,然后从结果中构造一个MongoEngine对象吗?使用直接语法只是返回一个标准字典。 – 2014-10-03 13:51:40
@ J-bob老实说,我从来没有尝试过。但基本的概念是,构造函数的“参数”应该与返回的值相同。因此,传递“原始”对象响应并“投射”到您希望访问该类上的其他方法的类的类型应该不是问题。在其他语言实现中完成它。但更多的是一个MongoEngine的顾问,而不是一个普通的用户。 – 2014-10-03 14:05:40
对于一个变通方法,仍可以让你MongoEngine对象,我想通了,我可以用MongoEngine的'__raw__'参数('User.objects(__ __原料= {>}'),这将返回MongoEngine对象。 – 2014-10-15 16:17:16