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

Golang操作MongoDB查询最近15分钟插入记录结果不符合预期求助

问题根因

你的代码核心问题出在聚合管道的时间筛选逻辑是固定不变的:

  • 你把dashboardAggregations定义为全局变量,初始化时执行的primitive.NewDateTimeFromTime(time.Now().Add(-15 * time.Minute))只会在程序启动时计算一次,生成的是程序启动时刻减15分钟的固定时间阈值,后续所有查询都会复用这个固定值,不会随当前查询时间动态更新,自然会出现超出15分钟范围的旧数据被返回的问题。
  • 全局复用聚合管道、查询后截断管道的写法还存在并发安全风险,多请求同时操作同一个管道变量时会出现逻辑混乱。

修复方案

不要全局定义固定的聚合管道,改为每次执行查询时动态生成管道,每次都重新计算15分钟的时间阈值:

  1. 封装管道生成逻辑
// 每次查询前动态生成最新的聚合管道
func getDashboardAggregationPipeline(userIds []interface{}) bson.A {
    pipeline := bson.A{
        bson.M{
            "$match": bson.M{
                "created_at": bson.M{
                    // 每次生成管道时重新计算当前时间减15分钟的阈值
                    "$gte": primitive.NewDateTimeFromTime(time.Now().Add(-15 * time.Minute)),
                },
            },
        },
        bson.M{
            "$sort": bson.M{
                "serial": -1,
            },
        },
        bson.M{
            "$group": bson.M{
                "_id":   "$userId",
                "users": bson.M{"$push": "$$ROOT"},
            },
        },
    }
    // 按需追加用户ID筛选条件
    if len(userIds) > 0 {
        pipeline = append(pipeline, bson.M{"$match": bson.M{"_id": bson.M{"$in": userIds}}})
    }
    return pipeline
}
  1. 修改查询逻辑
// 每次查询动态生成新的管道,无需复用全局变量
dashboardAggregations := getDashboardAggregationPipeline(userIds)
cursor, err = locationCollection.Aggregate(dbContext, dashboardAggregations)
if err != nil {
    return nil, err
}
// 原有管道截断逻辑可以直接删除,无需再复用管道

内容的提问来源于stack exchange,提问作者ma_jafari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:57:02