通过 zip 进行 MongoDB 地理空间搜索

Posted

技术标签:

【中文标题】通过 zip 进行 MongoDB 地理空间搜索【英文标题】:MongoDB geospatial search by zip 【发布时间】:2014-07-10 19:44:08 【问题描述】:

我正在使用 MongoDB 进行一些地理空间查询。我的邮政编码集合如下所示:


  _id: "60661",
  city: "CHICAGO",
  state: "IL",
  loc: [
        -87.68,
        41.83
       ]

添加二维索引后,我可以成功运行以下查询:

db.zipcodes.find( loc:  $near: [ -87.68, 41.83 ], $maxDistance: 5*(1/69)  )

这将返回发送的经度/纬度坐标 5 英里范围内的所有邮政编码。

我将如何发送邮政编码而不是 lon/lat 位置?像这样:

db.zipcodes.find( loc:  $near: "60661", $maxDistance: 5*(1/69)  )

谢谢!

【问题讨论】:

【参考方案1】:

这不是地理空间索引的工作方式,也不是查询应该如何工作的方式。考虑一下,当您创建索引时,您的语句可能是这样的:

db.zipcodes.ensureIndex( "loc": "2d" )

所以您要求在“loc”字段上创建2d index,该字段还包含地理空间索引所需格式的数据。这意味着它在“loc”字段中索引数据。

您建议以某种方式提供另一个不是“loc”的字段作为查询的一部分,因此与数据无关。这根本行不通,因为该数据不在“loc”字段中。本质上,这与在“州”字段下查询“城市”的值没有什么不同。地理空间查询中的字段选择没有什么特别的魔力,只是从索引中选择范围的工具。

不过,混合查询表单并没有错,因此,如果您想过滤更多细节的结果,而不仅仅是与给定点的接近程度,您可以执行以下操作:

 db.zipcodes.find(
     "loc":  
         "$near": [ -87.68, 41.83 ], 
         "$maxDistance": 5*(1/69) 
      , 
      "_id":  "$gte": "60630", "$lte": "60680" 
 )

这不仅会找到离查询点最近的点,还会将这些结果限制在范围内的那些邮政编码。

如果事实上您所寻找的只是您不知道点坐标但您知道“邮政编码”,那么您需要发出两个查询才能获得结果。

var zipLoc = db.zipcodes.findOne( "_id": "60661" )
var results = db.zipcodes.find(
    "loc":  
         "$near": zipLoc.loc, 
         "$maxDistance": 5*(1/69) 
      
)

这就是您在某个“邮政编码”附近返回结果的方式。

【讨论】:

谢谢尼尔,这是一个很好的答案。我真的很感激! 尼尔,你是如何得到“$gte”值的?

以上是关于通过 zip 进行 MongoDB 地理空间搜索的主要内容,如果未能解决你的问题,请参考以下文章

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

通过 GeoServer 在 MongoDB 中提供地理空间数据

MongoDB - 地理空间交叉点性能

使用 Doctrine MongoDB ODM 进行地理空间查询

如何使用 Go 驱动程序或 mgo/qmgo 在 MongoDB 中存储地理空间数据?

具有稀疏复合索引的 MongoDB $near 地理空间查询错误 13311