【问题标题】:Use $geowithin on multiple boxes - mongoDB在多个盒子上使用 $geowithin - mongoDB
【发布时间】:2014-06-10 20:13:08
【问题描述】:

我需要搜索框内的所有点。所以我在 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 那样使用它短路评估。我也不能使用 aggregation,因为 aggregation 仅支持 $geonear。我不想为每个框打一个单独的查询。请建议。

【问题讨论】:

    标签: mongodb mongoose pymongo geojson aggregation-framework


    【解决方案1】:

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

    【讨论】:

    • 这是否也适用于更复杂的多边形。我已按照您的指示进行操作,但我得到的匹配项似乎来自多边形重叠的地方
    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2013-09-16
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多