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

MongoDB如何通过聚合(含$unwind)分别展开不同数组?

如何用MongoDB聚合实现多数组拆分并生成指定格式文档

可以实现这个需求,核心是通过数组包装合并、展开、动态字段生成的聚合步骤完成,以下是具体的聚合管道方案:

db.collection.aggregate([
  {
    $project: {
      id: 1,
      prop1: 1,
      prop2: 1,
      // 将两个数组包装为带类型标识的统一数组
      tempItems: {
        $concatArrays: [
          {
            $map: {
              input: "$array1",
              as: "item",
              in: { type: "array1", value: "$$item" }
            }
          },
          {
            $map: {
              input: "$array2",
              as: "item",
              in: { type: "array2", value: "$$item" }
            }
          }
        ]
      }
    }
  },
  { $unwind: "$tempItems" }, // 展开统一后的数组,每个元素生成单独文档
  {
    $project: {
      id: 1,
      prop1: 1,
      prop2: 1,
      // 根据类型标识动态生成对应字段,不符合的字段自动移除
      array1: {
        $cond: [{ $eq: ["$tempItems.type", "array1"] }, "$tempItems.value", "$$REMOVE"]
      },
      array2: {
        $cond: [{ $eq: ["$tempItems.type", "array2"] }, "$tempItems.value", "$$REMOVE"]
      },
      tempItems: "$$REMOVE" // 清理临时字段
    }
  }
])

步骤说明:

  • 第一步:包装合并数组
    保留原文档的基础字段(id/prop1/prop2),用$map分别将array1和array2的每个元素包装成带type标识的对象,再通过$concatArrays将两个包装后的数组合并为一个统一的tempItems数组,把分散在两个数组的元素整合到一处。
  • 第二步:展开数组
    使用$unwind将tempItems数组展开,每个元素对应生成一个新文档,此时每个文档包含基础字段和一个记录原数组类型与元素的tempItems对象。
  • 第三步:生成目标结构
    通过$cond判断tempItems.type的值,动态为array1或array2字段赋值,不符合条件的字段用$$REMOVE移除,最后清理临时的tempItems字段,得到完全符合需求的文档结构。

内容的提问来源于stack exchange,提问作者S-Wing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:15:57