使用Golang的mgm包从MongoDB查询数据时的日期格式问题求助
解决Golang(mgm包)查询MongoDB日期字段失败的问题
问题场景
MongoDB集合中appnt_date为日期类型,在Compass中用以下查询能正常获取目标文档:
{ "appnt_date": { "$eq": ISODate("2024-01-25T00:00:00.000Z") } }
但使用Golang的mgm包,基于time.Time构造查询条件时始终无法匹配,尝试过两种无效写法:
- 转成
primitive.DateTime:
targetDate := time.Date(2024, 1, 25, 0, 0, 0, 0, time.UTC) targetDateTime := primitive.NewDateTimeFromTime(targetDate) filter := bson.M{ "appnt_date": targetDateTime}
- 转成字符串格式:
targetDate := time.Date(2024, 1, 25, 0, 0, 0, 0, time.UTC) formattedDate := targetDate.Format("2006-01-2T15:04:05.000Z") filter := bson.M{ "appnt_date": formattedDate}
MongoDB中appnt_date实际存储格式为:appnt_date: 2024-01-25T00:00:00.000+00:00
原因分析
- 第一种写法:
primitive.DateTime是MongoDB Go驱动对BSON日期的底层封装类型,但mgm框架默认会将结构体中的time.Time字段自动映射为MongoDB日期类型,直接用primitive.DateTime匹配会导致类型不兼容。 - 第二种写法:将日期转为字符串后,查询条件是字符串类型,而MongoDB中存储的是日期类型,字符串与日期类型无法直接匹配,因此查询无结果。
正确解决方案
方案1:直接使用time.Time作为查询条件
mgm框架支持直接将time.Time类型序列化为MongoDB日期类型,直接用time.Time构造查询即可:
targetDate := time.Date(2024, 1, 25, 0, 0, 0, 0, time.UTC) filter := bson.M{"appnt_date": targetDate} // 执行查询示例 var docs []YourModel err := mgm.Coll(&YourModel{}).Find(ctx, filter).All(&docs)
方案2:使用$eq明确匹配(与Compass查询逻辑一致)
如果需要和Compass的查询逻辑完全对齐,也可以用$eq包裹time.Time:
targetDate := time.Date(2024, 1, 25, 0, 0, 0, 0, time.UTC) filter := bson.M{ "appnt_date": bson.M{"$eq": targetDate}, }
方案3:查询当天所有文档(常见场景优化)
如果需求是查询2024-01-25全天的所有文档(而非仅0点整的文档),建议用时间范围查询,避免因文档时间非整点导致漏查:
// 构造当天起始时间(UTC时区) startDate := time.Date(2024, 1, 25, 0, 0, 0, 0, time.UTC) // 构造次日起始时间作为范围结束 endDate := startDate.AddDate(0, 0, 1) filter := bson.M{ "appnt_date": bson.M{ "$gte": startDate, "$lt": endDate, }, }
内容的提问来源于stack exchange,提问作者Ayush
相关产品推荐
相关产品推荐

