MongoDB无法解析查询(2dsphere):$ geoWithin:

时间:2014-06-05 15:10:03

标签: mongodb pymongo geojson

我的Collection中有以下对象,如下所示:

{
    "_id" : ObjectId("527d33a8623f6efd1c997440"),
    "location" : {
        "geometry" : {
            "type" : "Point",
            "coordinates" : [ 
                -78.4067, 
                37.26725
            ]
        },
        "type" : "Feature",
        "properties" : {
            "name" : "Something here"
        }
    },
    "name" : "Name of Object"
}

我有以下索引:

{
    "location.geometry" : "2dsphere"
}

我可以做以下事情:

 db.myCollection.find({'location.geometry':{'$near':{'$geometry':{'type':"Point", 'coordinates': [-78.406700,37.267250]}, '$maxDistance' : 1000 }}})

但是,我可以执行以下操作:

db.myCollection.find( { 'location.geometry': { '$geoWithin': 
                                            { '$geometry' :
                                                { 'type' : "Polygon", 
                                                  'coordinates' :  [ [ -118.108006, 34.046072], [ -117.978230, 34.041521] , [ -117.987328,33.913645 ]]  } }
                                         } } )

因为它返回错误:

error: {
    "$err" : "can't parse query (2dsphere): { $geoWithin: { $geometry: { type: \"Polygon\", coordinates: [ [ -118.108006, 34.046072 ], [ -117.97823, 34.041521 ], [ -117.987328, 33.913645 ] ] } } }",
    "code" : 16535
}

我使用geoWithin错了吗?它不能用在这个索引上吗?

2 个答案:

答案 0 :(得分:1)

您为$ geowithin查询提供的多边形不正确。多边形需要具有与GeoJSON定义相同的起点和终点。

正确的查询是:

db.myCollection.find( { 'location.geometry': 
                           { '$geoWithin': 
                                    { '$geometry' :
                                          { 'type' : "Polygon", 
                                             'coordinates' :  [ 
                                                   [ -118.108006, 34.046072], 
                                                   [ -117.978230, 34.041521], 
                                                   [ -117.987328,33.913645 ],
                                                   [ -118.108006, 34.046072]
                                                ]  
                                          } 
                                     }
                             }
                       }
                     );

注意更新后的坐标数组。

显然,MongoDB文档中提到的关于多边形隐式连接here 不正确。它说当你使用MongoDB中的$ polygon定义多边形时,只有隐含的连接。它没有说明智能,并在提供给查询的GeoJSON多边形中进行隐式连接。

事实上,如果对于某些GeoJSON变量,你说它的类型是多边形而你没有将它的开头与结尾连接起来,那么你首先没有创建一个正确的GeoJSON多边形。

答案 1 :(得分:1)

关于$ geoWithin查询的MongoDB文档中存在错误。虽然文档说明:

  

指定的最后一点始终隐式连接到第一个点。   您可以根据需要指定任意数量的点,因此也可以指定边数。

这是不正确的。需要关闭多边形。在MongoDB Jira中有一张关于此的公开票:

https://jira.mongodb.org/browse/DOCS-2029

所以你的第一个和最后一个点必须相等 - 你不能依赖MongoDB隐式绘制多边形的最后一行。