Golang MongoDB聚合查询返回空cursor但mongosh运行正常如何排查?
排查方向
1. 优先修正明显的查询结构不一致问题
- 你当前Go代码的match阶段,时间过滤字段路径错误:mongosh中用的是
features.properties.new_time,但Go代码里写的是properties.new_time,$unwind之后数组元素是挂载在features字段下的,少了前缀必然匹配不到任何数据。 - 检查
selectorGeoPoint的格式是否正确:MongoDB的$centerSphere要求坐标是[经度, 纬度]的float64数组,确认你传入的selectorGeoPoint顺序、值和mongosh里的[-125.0364331, 78.925942]完全一致。 - 检查
radius的取值:mongosh里是10/3963.2,确认Go里计算的radius值和这个完全相等,单位是否统一(该除数对应英里转弧度,如果用公里除数应为6378.1,不要搞混单位)。 - 确认
startDateTime和endDateTime的时区是否正确,两个值是不是和mongosh里的2020-04-05T05:00:00Z、2020-04-07T11:00:00Z完全一致,有没有时区偏移导致时间范围不匹配。
2. 验证构造的聚合语句是否和mongosh一致
把Go里构造的Pipeline转成扩展JSON打印出来,和mongosh的查询直接对比:
// 打印构造好的聚合语句验证 pipeline := mongo.Pipeline{unwindStage, matchStage} bs, err := bson.MarshalExtJSON(pipeline, true, false) if err == nil { fmt.Println("构造的聚合查询:", string(bs)) }
逐字段对比输出的JSON和mongosh里的查询结构,确认完全一致。
3. 排查超时/执行错误问题
- 你当前代码没有检查Aggregate返回的err,先补充错误判断:
filterCursor, err := collection.Aggregate(ctx, mongo.Pipeline{unwindStage,matchStage}) if err != nil { fmt.Println("聚合查询出错:", err) // 超时错误会明确返回context deadline exceeded,可直接判断错误类型 }
RemainingBatchLength()返回0不代表没有数据,初始状态下结果还没拉取到第一批,需要主动拉取数据后再判断结果数量:
var results []bson.M if err = filterCursor.All(ctx, &results); err != nil { fmt.Println("解析结果出错:", err) } fmt.Println("实际返回结果条数:", len(results))
4. 其他可能性排查
- 确认Go代码连接的MongoDB集群、库、表和mongosh连接的是同一个,没有连错环境、选错库表的情况。
- 检查Go驱动版本是否兼容你当前MongoDB服务端的版本,跨大版本可能出现功能兼容问题。
- 如果开启了权限校验,确认当前连接的账号有没有events集合的查询权限,有没有字段级权限限制导致拿不到数据。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

