MongoDB 聚合查询如何实现按日期分组 每个日期仅返回1条结果
MongoDB聚合查询按自然日去重解决方案
核心调整逻辑
要实现每个自然日期仅返回1条结果,需要在$lookup的子管道中新增按日期分组的阶段,优先保留每日最新的一条记录即可。
调整后的查询语句
.aggregate([ { $lookup: { from: 'community_stats', as: 'stats', let: { id: '$_id' }, pipeline: [ { $match: { $expr: { $eq: ['$community', '$$id'] }, }, }, // 先按时间倒序,保证同一日内最新的记录排在最前 { $sort: { date: -1 } }, // 按自然日期分组,每组仅保留第一条(当日最新) { $group: { _id: { // 按年/月/日维度分组,也可以用$dateToString转成'%Y-%m-%d'格式作为分组id year: { $year: '$date' }, month: { $month: '$date' }, day: { $dayOfMonth: '$date' } }, latestDoc: { $first: '$$ROOT' } } }, // 将分组拿到的文档还原为原始结构 { $replaceRoot: { newRoot: '$latestDoc' } }, // 分组后重新排序,保证返回结果是按时间倒序排列 { $sort: { date: -1 } }, // 取最近5天的记录 { $limit: 5 } ], }, }, ])
补充说明
如果需要保留当日最早的记录,把$first换成$last即可。如果涉及时区问题,可以在$year/$month/$dayOfMonth或者$dateToString操作符中添加timezone参数指定时区,避免日期计算偏差。
内容的提问来源于stack exchange,提问作者Jordan Pinski
相关产品推荐
相关产品推荐

