You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:54:06