MongoDB geoNear查询始终返回空结果问题求助
解决MongoDB geoNear返回空结果的问题
我帮你排查出几个关键问题,一步步调整就能拿到预期结果了:
1. 查询条件的拼写错误
你查询语句里的cusine是拼写失误!样本数据里的菜系字段名是cuisine(多了一个字母i),这个错误直接导致query: { cusine: "Thai" }匹配不到任何餐厅——哪怕第二个餐厅确实是Thai菜系,也会被错误过滤掉。
2. 缺少地理空间索引
使用geoNear命令必须先创建对应的2dsphere索引,否则MongoDB无法执行地理空间查询,这也是你看到nscanned: 0(没有扫描任何文档)的核心原因。你需要针对存储GeoJSON数据的字段创建索引:
db.restaurantCollection.createIndex({ "address.location": "2dsphere" })
注意:索引要建在address.location路径上,因为你的地理数据存在这个层级下。
3. 部分数据的GeoJSON格式错误
第一个餐厅的address.location里,type字段名后面多了一个空格:"type " : "Point",这不符合GeoJSON规范,会导致该文档的地理信息无法被MongoDB识别。你可以通过更新操作修正它:
db.restaurantCollection.updateOne( { _id: "1" }, { $set: { "address.location.type": "Point" } } )
修正后的查询语句
把拼写错误修正后,运行以下命令就能拿到结果了:
db.runCommand( { geoNear: "restaurantCollection", near: { type: "Point", coordinates: [ -84.369605, 33.822451 ] }, spherical: true, query: { cuisine: "Thai" }, minDistance: 0, maxDistance: 10000 } )
这个查询会返回第二个餐厅("26 Thai Kitchen & Bar"),因为它的坐标和你指定的near完全一致,距离为0,且符合菜系过滤条件。
内容的提问来源于stack exchange,提问作者J. pal
相关产品推荐
相关产品推荐

