MongoDB中如何按日期对comments集合数据进行分组?
按日期分组MongoDB comments集合的几种实用方案
针对你的comments集合,我整理了几种常用的按日期分组实现方式,你可以根据自己需要的时间粒度来选择:
1. 按天分组(格式化日期为字符串)
这种方式会把createdAt转换为YYYY-MM-DD格式的字符串作为分组键,结果直观易读:
db.comments.aggregate([ { $group: { _id: { $dateToString: { format: "%Y-%m-%d", date: "$createdAt" } }, commentCount: { $sum: 1 }, // 统计当天的评论总数 dailyComments: { $push: "$$ROOT" } // 可选:将当天所有评论文档存入数组 } }, { $sort: { _id: 1 } } // 按日期升序排序,可选 ])
执行后会得到类似这样的结果:
{ "_id" : "2018-04-09", "commentCount" : 2, "dailyComments" : [/* 当天的两条评论文档 */] } { "_id" : "2018-04-10", "commentCount" : 1, "dailyComments" : [/* 当天的评论文档 */] }
2. 按天分组(提取年/月/日结构化字段)
如果需要后续按年月筛选数据,这种结构化的分组键会更方便:
db.comments.aggregate([ { $group: { _id: { year: { $year: "$createdAt" }, month: { $month: "$createdAt" }, day: { $dayOfMonth: "$createdAt" } }, commentCount: { $sum: 1 }, latestComment: { $last: "$comment" } // 可选:获取当天最后一条评论内容 } }, { $sort: { "_id.year": 1, "_id.month": 1, "_id.day": 1 } } ])
结果的_id会是一个包含年、月、日的对象,比如{ "year" : 2018, "month" : 4, "day" : 9 }。
3. 按其他粒度分组(月/年/小时)
如果需要按月或年分组,只需调整$group里的_id字段即可:
- 按月分组示例:
db.comments.aggregate([ { $group: { _id: { year: { $year: "$createdAt" }, month: { $month: "$createdAt" } }, commentCount: { $sum: 1 } } }, { $sort: { "_id.year": 1, "_id.month": 1 } } ])
4. 用$dateTrunc简化分组(MongoDB 5.0+)
如果你使用的是MongoDB 5.0及以上版本,$dateTrunc可以直接把日期截断到指定粒度,代码更简洁:
db.comments.aggregate([ { $group: { _id: { $dateTrunc: { date: "$createdAt", unit: "day" } }, // 可选unit: month/year/hour等 commentCount: { $sum: 1 } } }, { $sort: { _id: 1 } } ])
这里_id会是截断后的ISODate(比如当天的零点时间),类型统一,适合后续的日期比较操作。
性能优化提示
如果你的comments集合数据量较大,建议给createdAt字段创建索引,能大幅提升聚合操作的速度:
db.comments.createIndex({ createdAt: 1 })
内容的提问来源于stack exchange,提问作者Ashish Choudhary
相关产品推荐
相关产品推荐

