我使用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) } })
谢谢!
答案 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"附近返回结果的方法。