【问题标题】:trouble with mongoengine and geospatial querymongoengine 和地理空间查询的问题
【发布时间】:2014-11-27 19:05:24
【问题描述】:

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

【问题讨论】:

    标签: mongodb pymongo mongodb-query mongoengine


    【解决方案1】:

    我在这里尖叫错误。

    如果我在一组类似的数据上尝试此操作,如下所示:

    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
            }
        }
    }):
    

    主要是因为我们在应该在$near 运算符参数“内”的位置发出$maxDistance 修饰符。

    提交错误。但是您可以使用直接语法来获得结果作为一种变通方法,直到修复为止。

    【讨论】:

    • 好的,我会提交一个错误。但是与此同时,您是否知道是否可以使用直接语法然后从结果中构造一个 MongoEngine 对象?使用直接语法只会返回一个标准字典。
    • @J-bob 老实说,我从未尝试过。但基本概念是构造函数的“参数”“应该”与返回的值相同。因此,仅将“原始”对象响应和“强制转换”传递给要访问该类上的其他方法的公开的类类型应该不是问题。在其他语言实现中完成。但更多的是 MongoEngine 的顾问,而不是 MongoEngine 的普通用户。
    • 关于仍然可以获得 MongoEngine 对象的解决方法,我发现我可以使用 MongoEngine 的 __raw__ 参数 (User.objects(__raw__={<<raw pymongo syntax here>>})。这将返回 MongoEngine 对象。
    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2012-10-06
    • 2015-06-07
    • 2013-09-25
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多