在多个盒子上使用$geoinn-mongoDB



我需要搜索框中的所有点。所以我在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。我不想为每个框打一个单独的查询。请提出建议。

有一些"快捷方式"类型运算符可用于预定义的"地理"类型查询,例如$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版本中用作查询表单。

相关内容

  • 没有找到相关文章

最新更新