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

How to search documents with MongoDB geospatial queries within nearest cities in country?

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

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

如何在国内找到文件?

大多数 "heavy lifting" 如果这真的是由一般地理空间查询本身完成的,只要您使用像 $near or ideally $nearSphere with a 2dsphere 索引这样的操作来考虑地球的曲率。此类查询基本上找到 "nearest" 指向所查询的 "point" 或提供的 GeoJSON 对象,并以这种方式对响应中的结果进行排序。

使用 geoNear 命令的原始实现在响应中默认 "limit" 100 个文档,并且能够设置响应中的文档限制。这通常仍然有效,因为您通常不希望从这样的查询中得到太多响应,因为有些地方根本就不是 "near"。

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

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

这里的逻辑是,查询的对象必须是 "near" 查询的位置数据,并且也有匹配 "Wellington" "city" 的数据 $or 匹配 "country" 共 "New Zealand"。

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

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

当然,如果你 "really want to" 因为一般来说不需要它,因为所选对象已经按 "nearest" 结果排序返回,还有其他方法 "bound" 那些结果在一定范围内 "distance"。但是如果你真的想指定额外的 "bounds" 那么你可以。

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

因此,仅在文档中显示字段来表示 "longitude" 和 "latitude" 本身是不够的,您需要支持的存储格式以及 "index" 才能使用运算符如图所示。

条件中的其他数据可以包含在其他索引中,遵循带有和 $or 条件的查询选择指南,或者在复合索引中,只要该数据满足复杂性的规则可以组合。不需要对额外的数据字段进行索引,但通常是使用额外的查询参数进行查询的最佳方式。