如何在MongoDB聚合管道中合并数组对象并按分类合并对应服务数组
MongoDB聚合管道合并分类服务实现方案
你可以通过以下聚合管道实现需求:
db.你的集合名.aggregate([ // 拆分所有文档的category数组为单条分类文档 { $unwind: "$category" }, // 按分类ID和名称分组,收集所有对应服务数组 { $group: { _id: { id: "$category.id", name: "$category.name" }, serviceList: { $push: "$category.services" } } }, // 将二维服务数组合并为一维数组 { $addFields: { services: { $reduce: { input: "$serviceList", initialValue: [], in: { $concatArrays: ["$$value", "$$this"] } } } } }, // 调整输出字段格式为目标结构 { $project: { _id: 0, id: "$_id.id", name: "$_id.name", services: 1 } }, // 可选:如果需要最终输出为包含所有分类的单个数组,添加以下两个阶段 { $group: { _id: null, result: { $push: "$$ROOT" } } }, { $project: { _id: 0 } } ])
步骤说明
$unwind阶段:将每个文档里嵌套的category数组拆分,每条拆分后的文档仅包含一个分类对象,方便后续按分类维度聚合。$group阶段:以分类id和分类名作为唯一分组标识,将同一分类下的所有services数组全部收集,此时得到的serviceList是二维数组结构。$addFields阶段:通过$reduce操作遍历二维serviceList,用$concatArrays拼接所有子数组,得到合并后的一维services数组。如果需要对服务项去重,可以在此处给拼接结果套一层$setUnion,或者将分组阶段的$push改为$addToSet。$project阶段:调整输出字段结构,剔除内部使用的临时字段,还原为你需要的分类对象格式。- 可选的最终分组阶段:如果不需要单个数组结果,删掉最后两个阶段即可,此时聚合输出的每条结果就是单独的分类对象。
内容的提问来源于stack exchange,提问作者Sufail Kalathil
相关产品推荐
相关产品推荐

