MongoDB地理空间半径查询错误 无法匹配覆盖搜索点的目标记录
你当前的查询逻辑完全搞反了。
你写的$centerSphere查询的作用是:筛选位置点落在以搜索点为圆心、10公里为半径的固定范围内的所有记录,返回结果默认按距离搜索点远近排序,和你要的「文档自身可见半径覆盖搜索点」的需求完全不匹配。
你需要的逻辑等价于:搜索点落在「以文档自身位置为圆心、文档自身存储的可见半径为半径」的动态范围内,普通的find查询没办法处理这种每个文档判断条件半径不同的场景,需要用聚合管道实现。
正确实现步骤
- 先确认你的
location.point字段已经创建了2dsphere地理索引,否则聚合查询会报错。 - 用
$geoNear聚合阶段计算每个文档点位和搜索点的距离,再通过$match过滤出距离小于等于文档可见半径的结果即可。
示例代码如下:
// 替换为你实际传入的搜索经纬度、文档存储可见半径的字段名 const searchLongitude = xxx; const searchLatitude = xxx; const visibleRadiusField = "你的可见半径字段名"; const documents = await collection.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [searchLongitude, searchLatitude] }, distanceField: "calcDistance", // 自动生成的字段,存储搜索点到当前文档点位的距离 spherical: true, distanceMultiplier: 0.001 // 转换距离单位为公里,和你存储的可见半径单位统一 } }, { $match: { // 筛选距离小于等于文档自身可见半径的记录 $expr: { $lte: ["$calcDistance", `$${visibleRadiusField}`] } } } ])
如果需要保留按距离排序的结果,直接用上面的返回即可,如果不需要排序,可以在后面加$sort调整排序规则。
内容的提问来源于stack exchange,提问作者Juanperez
相关产品推荐
相关产品推荐

