MongoDB如何将多文档字段聚合为对象内顺序一致的数组?
MongoDB聚合优化方案
完全可以仅用1次$group阶段实现需求,你原写法里的第二个$group是冗余逻辑,可以直接去掉。
核心逻辑
同一个$group阶段内的多个$push累加器,元素推入顺序完全一致:只要前置排序规则确定,categories数组第n位的团队ID,对应的count值一定在count集合的第n位,天然满足两个数组元素一一对应的要求。
另外注意,第一次按_id: null分组后,整个管道只会输出1条汇总结果,根本不需要再做第二次分组——$group是阻塞算子,能少用就少用,结构包装的逻辑直接放到$project阶段做就行,性能更好。
最终可用聚合管道
[ // 可选阶段:需要固定categories排列顺序时保留,按自己的需求写排序规则即可 // 不需要固定顺序可以直接删掉这个阶段,两个数组依然会保持元素对齐,只是顺序为MongoDB默认的文档读取顺序 { $sort: { _id: 1 } }, // 唯一的$group阶段,一次性收集对齐的团队ID和对应count数组 { $group: { _id: null, categories: { $push: "$_id" }, countList: { $push: "$count" } } }, // 组装最终结构,去掉多余的_id字段 { $project: { _id: 0, categories: 1, series: [{ counts: "$countList" }] } } ]
补充说明
这个管道输出的结构和你给出的目标结构完全一致:series是长度为1的数组,内部对象的counts数组和外层categories数组元素严格对齐,完全满足需求。
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

