MongoDB聚合按日期分组时如何保留输出ISODate日期格式
MongoDB按天分组保留ISODate格式实现方案
你当前使用$dayOfMonth/$month/$year拆分字段分组的方式,会把日期拆成三个独立数值,丢失原有的ISODate类型,有两种成熟方案可以输出符合要求的ISODate格式分组结果:
方案1:高版本MongoDB最优写法(5.0及以上)
直接使用$dateTrunc操作符在分组阶段将日期截断到日粒度,不需要手动拆分拼接年月日,输出的_id直接就是ISODate类型,性能更好、写法更简洁:
{ $group: { _id: { $dateTrunc: { date: '$timeplay', unit: 'day' } }, listeners: { $sum: '$count' } } }
这个写法输出的_id是对应日期UTC零点的标准ISODate值,完全满足按天分组的业务需求。
方案2:兼容低版本的重建写法
如果你的MongoDB版本低于5.0无法使用$dateTrunc,可以在现有分组逻辑的基础上,通过$dateFromParts操作符用拆分出来的年、月、日字段重建ISODate类型,只需要在$group阶段后追加一个聚合阶段即可:
// 原有分组逻辑 { $group: { _id: { day: { $dayOfMonth: '$timeplay' }, month: { $month: '$timeplay' }, year: { $year: '$timeplay' } }, listeners: { $sum: '$count' } } }, // 追加阶段重建ISODate并整理输出结构 { $replaceRoot: { newRoot: { date: { $dateFromParts: { year: '$_id.year', month: '$_id.month', day: '$_id.day' } }, listeners: '$listeners' } } }
$dateFromParts是MongoDB原生提供的时间构造操作符,传入年、月、日参数后会直接返回标准BSON Date类型,也就是需要的ISODate格式结果。
当前语句的输出效果如下:
内容的提问来源于stack exchange,提问作者Russell Harrower
相关产品推荐
相关产品推荐

