MongoDB聚合管道:将文档列表转为ID列表的最优方案
问题:MongoDB聚合管道转换文档集合的高效实现方式
现有文档集合如下:
[ { id: 1 }, {id: 2}, {id: 3} ]
需将其转换为以下两种格式之一:
格式A(含字段的文档):
{ ids: [1, 2, 3] }
格式B(纯数组):
[1, 2, 3]
哪种聚合管道实现的效率最高?
结论
生成**格式B(纯数组)**的聚合管道效率更高,核心原因是它的处理逻辑更直接,减少了一层文档结构的包装与序列化开销。
具体实现及解析
1. 格式B的高效实现
db.collection.aggregate([ // 收集所有文档的id到数组 { $group: { _id: null, ids: { $push: "$id" } } }, // 直接将数组作为输出根文档 { $replaceRoot: { newRoot: "$ids" } } ])
如果使用MongoDB 4.4及以上版本,也可以用更简洁的$replaceWith替代$replaceRoot:
db.collection.aggregate([ { $group: { _id: null, ids: { $push: "$id" } } }, { $replaceWith: "$ids" } ])
这个流程仅需两个阶段:先通过$group聚合所有id到数组,再直接将数组作为输出结果,没有多余的字段处理步骤。
2. 格式A的实现
db.collection.aggregate([ { $group: { _id: null, ids: { $push: "$id" } } }, // 剔除_id字段,保留ids字段 { $project: { _id: 0 } } ])
这个流程需要在聚合后维护文档的键值结构,输出一个包含ids数组的文档,虽然性能差距不大,但相比格式B多了一层文档结构的处理,在数据量较大时会产生细微的效率差异。
内容的提问来源于stack exchange,提问作者italktothewind
相关产品推荐
相关产品推荐

