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

时间:2014-05-21 23:27:59

标签: mongodb mongoose mongodb-query geospatial

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

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

添加我的2d索引后,我可以成功运行以下查询:

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

这将返回距离发送的lon / lat坐标5英里内的所有邮政编码。

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

所以你要求在" loc"上创建一个2d index。字段,它还具有Geo-Spatial索引所需格式的数据。这意味着它将" loc"中的数据编入索引。领域。

你打算做的是以某种方式提供另一个不是" loc"作为查询的一部分,因此与数据无关。这根本无法奏效,因为该数据不在" loc"领域。从本质上讲,查询" City"的价值也没什么不同。在"州"领域。在Geo-Spatial查询中没有关于字段选择的特殊魔法,只是用于从索引中选择范围的工具。

虽然混合查询表单没有任何问题,所以如果您希望以更详细的方式过滤结果,而不仅仅是接近给定点,您可以这样做:

 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) 
      }
})

这就是你要在某个" zipcode"附近返回结果的方法。