我的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错了吗?它不能用在这个索引上吗?
答案 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隐式绘制多边形的最后一行。