You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:15:03