我需要搜索位于框中的所有点。所以我在mongoDB中使用以下查询
db.places.find({
"loc" : {
"$geoWithin" : {
"$box": [
[ 0 , 0 ] ,
[ 100 , 100 ]
]
}
}
})
现在我要在其中搜索多个框,我想获得任何框中的所有点。我想要像
这样的东西db.places.find({
"loc": {
"$geoWithin": {
"$box":[ [ 0 , 0 ], [ 25 , 25 ] ],
[ [ 40 , 40 ] , [ 75 , 75 ] ],
[ [ 90 , 90 ] , [ 100 , 100 ] ]
}
}
})
我无法使用$or
进行短路评估。我也不能使用聚合,因为聚合仅支持$geonear
。我不想为每个框打一个单独的查询。请建议。
答案 0 :(得分:1)
有一些“快捷”类型的运算符可用于预定义的“geo”类型查询,例如 $box
。但是对于任何更高级的东西,您实际上都想要正式声明GeoJSON结构并使用 $geometry
运算符:
因此,如果您考虑以下文件:
{ "loc" : { "type" : "Point", "coordinates" : [ 3, 6 ] } }
{ "loc" : { "type" : "Point", "coordinates" : [ 9, 12 ] } }
{ "loc" : { "type" : "Point", "coordinates" : [ 45, 45 ] } }
{ "loc" : { "type" : "Point", "coordinates" : [ 30, 30 ] } }
{ "loc" : { "type" : "Point", "coordinates" : [ 76, 76 ] } }
然后使用以下查询:
db.geo.find({
"loc": {
"$geoWithin": {
"$geometry":{
"type": "MultiPolygon",
"coordinates": [
[[ [ 0, 0 ], [ 0, 25 ], [ 25, 25 ], [ 25, 0 ], [ 0, 0 ] ]],
[[ [ 40, 40 ], [ 40, 75 ], [ 75, 75 ], [ 75, 40 ], [ 40, 40 ] ]],
[[ [ 80, 80 ], [ 80, 90 ], [ 90, 90 ], [ 90, 80 ], [ 80, 80 ] ]]
]
}
}
}
})
您将获得返回的结果:
{ "loc" : { "type" : "Point", "coordinates" : [ 3, 6 ] } }
{ "loc" : { "type" : "Point", "coordinates" : [ 9, 12 ] } }
{ "loc" : { "type" : "Point", "coordinates" : [ 45, 45 ] } }
因此,对于此类查询,您需要完全支持GeoJSON几何体。
这绝对适用于MongoDB 2.6,也应该是2.4.10的情况。扩展的GeoJSON类型可用于这些版本的索引,但(未尝试)可能在早期的2.4版本中用作查询形式。