Golang操作MongoDB查询最近15分钟插入记录结果不符合预期求助
问题根因
你的代码核心问题出在聚合管道的时间筛选逻辑是固定不变的:
- 你把
dashboardAggregations定义为全局变量,初始化时执行的primitive.NewDateTimeFromTime(time.Now().Add(-15 * time.Minute))只会在程序启动时计算一次,生成的是程序启动时刻减15分钟的固定时间阈值,后续所有查询都会复用这个固定值,不会随当前查询时间动态更新,自然会出现超出15分钟范围的旧数据被返回的问题。 - 全局复用聚合管道、查询后截断管道的写法还存在并发安全风险,多请求同时操作同一个管道变量时会出现逻辑混乱。
修复方案
不要全局定义固定的聚合管道,改为每次执行查询时动态生成管道,每次都重新计算15分钟的时间阈值:
- 封装管道生成逻辑
// 每次查询前动态生成最新的聚合管道 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 }
- 修改查询逻辑
// 每次查询动态生成新的管道,无需复用全局变量 dashboardAggregations := getDashboardAggregationPipeline(userIds) cursor, err = locationCollection.Aggregate(dbContext, dashboardAggregations) if err != nil { return nil, err } // 原有管道截断逻辑可以直接删除,无需再复用管道
内容的提问来源于stack exchange,提问作者ma_jafari
相关产品推荐
相关产品推荐

