mongoengine和地理空间查询的麻烦

时间:2014-10-02 18:06:11

标签: mongodb pymongo mongodb-query mongoengine

我无法让Mongoengine的地理空间查询工作。我有一个User mongoengine类,其中有一个名为cached.geoLoc的字段,该字段属于mongoengine类型PointField()。如果我打电话

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可能是什么问题?

1 个答案:

答案 0 :(得分:2)

我在这里尖叫着。

如果我尝试使用类似以下内容的类似数据集:

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修饰符位于错误位置。

使用raw pymongo驱动程序命令发出的正确查询表单可以正常工作:

result = Geo._get_collection().find({
    "loc": {
        "$near": {
          "$geometry": {
            "type": "Point",
            "coordinates": [3,6]
          },
          "$maxDistance": 1000
        }
    }
}):

主要是因为我们发布了$maxDistance修饰符,它应该是"在" $near运算符参数。

提交错误。但是,您可以使用直接语法将结果作为解决方法,直到有修复。