MongoDB聚合查询:获取每个唯一ID的最新提交记录
MongoDB聚合实现按条件筛选+取每组最新记录
直接给你梳理清楚正确的聚合流程,步骤和代码如下:
- 先过滤数据:用
$match把符合x=y的记录筛选出来,先做过滤能减少后续排序、分组的处理量,提升性能。 - 按创建日期倒序排序:把最新的提交记录排在每组最前面,这里用你实际的创建日期字段(比如
createdAt),别依赖_id的隐含时间戳,显式字段语义更清晰、维护更省心。 - 分组提取最新记录:按你要去重的唯一业务标识(比如用户ID、实体ID这类,自己替换成实际字段名)分组,用
$first获取每组的第一条记录——也就是排序后最靠前的最新提交。 - 可选:还原文档结构:把分组后嵌套的记录提升为根文档,和原提交记录结构一致,方便后续业务处理。
完整代码示例:
Submission.aggregate([ // 第一步:筛选符合条件的提交记录 { $match: { x: y } }, // 第二步:按创建日期降序排序,最新记录在前 { $sort: { createdAt: -1 } }, // 第三步:按业务唯一字段分组,保留每组最新的完整记录 { $group: { _id: "$businessId", // 替换成你的实际去重字段,比如submitterId、entityId latestSubmission: { $first: "$$ROOT" } } }, // 可选:将最新记录转为根文档,结构与原数据一致 { $replaceRoot: { newRoot: "$latestSubmission" } } ])
关键注意点:
- 必须先执行
$match再做$sort,否则会对全集合数据排序,浪费资源 $sort一定要在$group之前执行,否则$first无法拿到每组的最新记录- 如果没有单独的创建日期字段,也可以用
$sort: { _id: -1 }(ObjectId自带时间戳),但还是建议添加显式的创建时间字段
内容的提问来源于stack exchange,提问作者lasJac
相关产品推荐
相关产品推荐

