MongoDB $geoNear聚合返回空数组问题求助
解决$geoNear聚合返回空数组的问题
以下是排查和解决的关键步骤:
1. 修正聚合阶段的语法错误
你的聚合数组中把$geoNear和$project放在了同一个阶段对象里,这是语法错误。每个聚合阶段必须是数组中的独立对象:
const distances = await Tour.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [lang * 1, lat * 1] }, distanceField: "distance", distanceMultiplier: multiplier } }, { $project: { distance: 1, name: 1 } } ])
2. 修复索引字段的拼写错误
你的索引代码里写的是startLoaction(少了字母c),如果Tour模型中存储地理位置的字段实际是startLocation(正确拼写),这个索引会完全无效,导致$geoNear无法找到对应的2dsphere索引:
tourSchema.index({ startLocation: '2dsphere' })
修正后,在MongoDB Compass的集合Indexes标签下,确认startLocation_2dsphere索引已成功创建。
3. 验证数据中的地理位置格式
确保Tour文档里的startLocation是标准GeoJSON Point格式,且坐标有效:
{ "startLocation": { "type": "Point", "coordinates": [经度数值, 纬度数值] // 注意顺序是经度在前、纬度在后 } }
4. 确认坐标输入的正确性
检查传入的latlang参数格式是否符合要求(例如31.2304,121.4737),可以在代码中添加日志验证转换后的坐标:
console.log('转换后的坐标:', [lang * 1, lat * 1]);
完成以上步骤后,重新执行聚合操作即可得到预期结果。
内容的提问来源于stack exchange,提问作者Mouez MT
相关产品推荐
相关产品推荐

