麻烦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操作参数“中”。

文件中的错误。但是,您可以使用直接语法来获得结果作为解决方法,直到出现修复。

+0

好吧,我将提交一个错误。但是与此同时,你知道是否可以使用直接语法,然后从结果中构造一个MongoEngine对象吗?使用直接语法只是返回一个标准字典。 – 2014-10-03 13:51:40

+0

@ J-bob老实说,我从来没有尝试过。但基本的概念是,构造函数的“参数”应该与返回的值相同。因此,传递“原始”对象响应并“投射”到您希望访问该类上的其他方法的类的类型应该不是问题。在其他语言实现中完成它。但更多的是一个MongoEngine的顾问,而不是一个普通的用户。 – 2014-10-03 14:05:40

+0

对于一个变通方法,仍可以让你MongoEngine对象,我想通了,我可以用MongoEngine的'__raw__'参数('User.objects(__ __原料= {>}'),这将返回MongoEngine对象。 – 2014-10-15 16:17:16