如何在MongoDB中合并集合所有文档的同名字段数组
MongoDB 合并全集合同名字段数组为一维数组的实现方法
你可以通过MongoDB聚合管道快速实现该需求,以下是两种常用实现方案:
方案1:全版本兼容实现
该方案支持所有MongoDB版本,适合小数据集场景:
db.你的集合名.aggregate([ // 拆分每个文档的categories数组为独立元素 { $unwind: "$categories" }, // 全局分组合并所有元素 { $group: { _id: null, result: { $push: "$categories" } } }, // 移除不需要的_id字段 { $project: { _id: 0 } } ])
执行后会直接返回你需要的一维数组结构:
{ "result" : ["a", "b", "c", "d", "e", "f", "g", "h", "i"] }
方案2:高性能实现(MongoDB 4.4+ 支持)
该方案不需要拆分数组,大集合场景下性能远高于方案1:
db.你的集合名.aggregate([ // 先把所有文档的categories数组合并为二维数组 { $group: { _id: null, tempArr: { $push: "$categories" } } }, // 把二维数组拍平为一维 { $project: { _id: 0, result: { $reduce: { input: "$tempArr", initialValue: [], in: { $concatArrays: ["$$value", "$$this"] } } } } } ])
注意事项
- 如果需要合并结果自动去重,把上述代码中的
$push替换为$addToSet即可 - 如果需要保留重复元素,使用默认的
$push即可
内容的提问来源于stack exchange,提问作者Nikolay Khvan
相关产品推荐
相关产品推荐

