MongoDB聚合查询:保留最新版本文档的全部字段
查询MongoDB中每个规则的最新版本记录(保留完整字段)
问题场景
现有如下结构的MongoDB文档:
{"rule_id": "rule_1", "description": "desc_rule_1_version_1", "version": 1}, {"rule_id": "rule_1", "description": "desc_rule_1_version_2", "version": 2}, {"rule_id": "rule_2", "description": "desc_rule_2_version_1", "version": 1}
需要获取每个rule_id对应的最新版本记录,同时保留文档的全部字段,预期结果:
{"rule_id": "rule_1", "description": "desc_rule_1_version_2", "version": 2}, {"rule_id": "rule_2", "description": "desc_rule_2_version_1", "version": 1}
解决方案
方法一:分组存文档后筛选
通过聚合管道先分组记录最大版本号,再筛选对应文档:
db.collection.aggregate([ // 按rule_id分组,记录最大版本号及组内所有文档 { $group: { _id: "$rule_id", maxVersion: { $max: "$version" }, docs: { $push: "$$ROOT" } } }, // 展开文档数组 { $unwind: "$docs" }, // 筛选出版本号等于最大版本的文档 { $match: { $expr: { $eq: ["$docs.version", "$maxVersion"] } } }, // 恢复原文档结构 { $replaceRoot: { newRoot: "$docs" } } ])
方法二:排序后分组取首项(更高效)
先按规则ID和版本号排序,确保最新版本排在组内首位,再直接取首项:
db.collection.aggregate([ // 按rule_id升序、version降序排序,让每个规则的最新版本排第一 { $sort: { rule_id: 1, version: -1 } }, // 按rule_id分组,取组内第一个文档(即最新版本) { $group: { _id: "$rule_id", latestDoc: { $first: "$$ROOT" } } }, // 恢复原文档结构 { $replaceRoot: { newRoot: "$latestDoc" } } ])
说明
- 方法二性能更优,因为排序后直接分组取首项,避免了后续的展开和匹配操作
$$ROOT代表当前处理的完整文档,确保能保留所有原始字段
内容的提问来源于stack exchange,提问作者Ankit Chouhan
相关产品推荐
相关产品推荐

