Mongoose组合地理$or查询后countDocuments返回0问题排查
问题原因及解决方法
核心问题:字段名不匹配
你在Compass中运行的多边形查询明确指定了匹配polygons字段,但代码编写合并查询时,两个$or条件都错误地使用了location字段,导致多边形匹配逻辑实际是查询不存在的location多边形属性,这就是返回计数为0的直接原因。
其他可能的影响因素
- 坐标顺序错误:MongoDB GeoJSON规范要求坐标格式为
[经度, 纬度],需确认插入的多边形坐标、用户坐标的经纬度顺序没有颠倒 - 缺少地理索引:地理查询依赖
2dsphere索引,未建索引可能导致查询结果异常或性能低下 - 模型字段定义错误:如果使用Mongoose操作,需确认
GEMS对应的Schema中正确定义了polygons字段为Polygon类型的GeoJSON结构
修正后的查询代码
const userLong = 17.3734 // 用户经度 const userLat = 78.4738 // 用户纬度 const advertquery = { $or: [ // 条件1:用户点落在商家存储的多边形范围内 { polygons: { $geoIntersects: { $geometry: { type: "Point", coordinates: [userLong, userLat] } } } }, // 条件2:商家位置在用户10km范围内 { location: { $geoWithin: { $centerSphere: [[userLong, userLat], 10 / 6378.1] } } } ] } // 执行计数 GEMS.countDocuments(advertquery).exec(function(err, count){ if(err) { console.log(err) return } console.log("TOTAL COUNTED : " + count) adcount = count })
额外校验步骤
执行以下语句创建必要的地理索引,确保查询效率和准确性:
db.GEMS.createIndex({location: "2dsphere", polygons: "2dsphere"})
内容的提问来源于stack exchange,提问作者Russell Harrower
相关产品推荐
相关产品推荐

