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

Posted

技术标签:

【中文标题】如何在国家/地区最近的城市内使用 MongoDB 地理空间查询搜索文档?【英文标题】:How to search documents with MongoDB geospatial queries within nearest cities in country? 【发布时间】:2015-03-15 20:42:10 【问题描述】:

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

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

我如何在国内找到文件?

【问题讨论】:

【参考方案1】:

如果这确实是由一般地理空间查询本身完成的,那么大部分“繁重的工作”,只要您使用像 $near 或理想情况下带有 2dsphere 索引的操作,以允许地球。此类查询基本上找到与所查询“点”或提供的 GeoJSON 对象的“最近”点,并以这种方式对响应中的结果进行排序。

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

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

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

这里的逻辑是,查询的对象必须“靠近”查询的位置数据,并且要么有数据匹配“惠灵顿”的“城市”$or匹配“新西兰”的“国家”。

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

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

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

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

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

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

【讨论】:

非常感谢您的帮助。如果您不介意,我有一些问题。 1. 我应该如何描述 mongoose.Schema 来存储带有位置的文档? 2. 是否可以将搜索限制在国家范围内(新西兰)? 3. 是否有可能知道灼热镇是否没有文件(因为如果没有我们会得到新西兰所有城市的文件)? @Erik 如果您还有其他问题,那么最好的提问方式是实际发布更多问题。如果您确实阅读并尝试了这里已有的内容,尽管答案应该是不言而喻的。 我创建了关于查询地理空间数据的新问题。 ***.com/questions/29084273/…如果你有时间请看这个:)

以上是关于如何在国家/地区最近的城市内使用 MongoDB 地理空间查询搜索文档?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 javascript AJAX 代码中显示所选国家/地区的城市名称和人口?

如何在 WooCommerce 中查找任何国家/地区的州/城市

如何使用意图和活动在 Xamarin Android 中插入城市、街道、邮政编码、国家/地区的联系人?

我如何获得某些国家/地区的城市列表?

如何根据 IP 地址自动填写城市、州和国家/地区表单字段?

地理 IP 和国家/地区/城市数据库