如何用MongoDB聚合查询账本数据中各primary_key的最新文档
MongoDB聚合查询获取每个primary_key的最新数据
针对你的追加式账本集合,要高效获取每个primary_key对应的最新数据(基于updated_at),可以使用以下两种聚合管道方案,均无需逐个查询主键,适合百万级数据量:
方案一:分组取最大时间后筛选对应文档
db.collection.aggregate([ // 按primary_key分组,计算每个组的最新updated_at并保留组内所有文档 { $group: { _id: "$primary_key", maxUpdatedAt: { $max: "$updated_at" }, allDocs: { $push: "$$ROOT" } } }, // 从组内文档中筛选出updated_at等于最新时间的文档,设为根文档输出 { $replaceRoot: { newRoot: { $arrayElemAt: [ { $filter: { input: "$allDocs", cond: { $eq: ["$$this.updated_at", "$maxUpdatedAt"] } } }, 0 ] } } } ])
方案二:先排序再分组取首条(性能更优)
db.collection.aggregate([ // 全局按updated_at降序排序,确保每个primary_key的最新数据排在最前 { $sort: { updated_at: -1 } }, // 按primary_key分组,直接取组内第一个文档(即最新数据) { $group: { _id: "$primary_key", latestDocument: { $first: "$$ROOT" } } }, // 将最新文档设为根文档输出 { $replaceRoot: { newRoot: "$latestDocument" } } ])
性能优化建议
为适配百万级数据量,建议创建复合索引加速聚合操作:
db.collection.createIndex({ primary_key: 1, updated_at: -1 })
该索引可直接支撑排序和分组阶段的查询逻辑,大幅降低资源消耗。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

