如何在国内最近的城市内使用MongoDB地理空间查询搜索文档?

时间:2015-03-15 20:42:10

标签: mongodb geolocation geospatial

假设用户在新西兰惠灵顿找到文件并提供惠灵顿城市的坐标:lat: -41.2864603, lng: 174.77623600000004

但如果这个城市没有文件,我需要在新西兰国家内最近的城市内搜索文件。

我怎样才能在国内找到文件?

1 个答案:

答案 0 :(得分:1)

大部分“繁重”如果这是由一般地理空间查询本身完成的,只要您使用$near或理想$nearSphere2dsphere索引等操作允许地球的曲率。这样的查询基本上找到了所提供的查询“点”或GeoJSON对象的“最近”点,并以这种方式对结果进行排序。

使用geoNear命令的原始实现在响应中具有100个文档的默认“限制”,并且能够设置响应中的文档限制。这通常仍然有效,因为您通常不希望从这样的查询中得到太多响应,因为事情根本不是“接近”。

但一般情况是,如果您想在逻辑中添加其他查询参数,则可以将它们添加到现有查询中:

db.collection.find({
    "$nearSphere": {
        "$geometry": {
            "type": "Point",
            "coordinates": [ 174.77623600000004, -41.2864603 ]
        }
    },
    "$or": [
        { "city": "Wellington" },
        { "country": "New Zealand" }
    ]
})

逻辑是查询的对象必须“接近”查询的位置数据,并且还要匹配“惠灵顿”$or的“城市”匹配“新西兰”的“国家”。 / p>

您可以交替表示一个完整的“或”条件,其中对象不一定与地理位置条件匹配,只要其他查询参数匹配某些内容:

db.collection.find({
    "$or": [
        { "$nearSphere": {
            "$geometry": {
                "type": "Point",
                 "coordinates": [ 174.77623600000004, -41.2864603 ]
            }
        }},
        { "city": "Wellington" },
        { "country": "New Zealand" }
    ]
})

当然,如果您“真的想要”,因为一般来说不应该需要它,因为所选对象已经按“最近”结果排序,并且还有其他方法可以将这些结果“绑定”到内部一定的“距离”。但是如果你真的想要指定额外的“边界”,那么你可以。

当然,在发出$near$nearSphere查询或其他变体时,必须有“2d”或“2dSphere”索引。另一个限制是数据必须以legacy coordinate pairsGeoJSON format的形式在文档中表示。在所有情况下,表示形式为<longitude><latitude>

因此,仅仅在文档中显示字段来表示“经度”和“纬度”本身是不够的,您需要支持的存储格式以及“索引”来使用所示的运算符。

条件中的其他数据可以包含在其他索引中,遵循使用和$or条件选择查询的准则,或者在复合索引中,因为该数据符合可能的复杂性规则结合。没有必要对其他数据字段建立索引,但它通常是使用其他查询参数进行查询的最佳方式。