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

MongoDB 4.0如何合并子文档中的所有值?

展开MongoDB集合中子文档并关联父文档_id

原始集合数据

[
  {
    "_id": "603f8c970f25800300a6c16e",
    "Hash": "vkqsgIPmB4/am4KJkERghDmmCUXEZjrGQxdCF3Fll2brR0YxJSXeTg==",
    "Components": [
      {
        "FieldA": "A-1",
        "FieldB": "B-1"
      },
      {
        "FieldA": "A-2",
        "FieldB": "B-2"
      }
    ]
  },
  {
    "_id": "609f8c970f25800300a7c16e",
    "Hash": "vkqsgIPmB4/am4KJkERghDmmCUXEZjrGQxdCF3Fll2brR0sddggdTs==",
    "Components": [
      {
        "FieldA": "A-3",
        "FieldB": "B-3"
      },
      {
        "FieldA": "A-4",
        "FieldB": "B-4"
      }
    ]
  }
]

期望输出结果

[
  {
    "_id": "603f8c970f25800300a6c16e",
    "FieldA": "A-1",
    "FieldB": "B-1"
  },
  {
    "_id": "603f8c970f25800300a6c16e",
    "FieldA": "A-2",
    "FieldB": "B-2"
  },
  {
    "_id": "609f8c970f25800300a7c16e",
    "FieldA": "A-3",
    "FieldB": "B-3"
  },
  {
    "_id": "609f8c970f25800300a7c16e",
    "FieldA": "A-4",
    "FieldB": "B-4"
  }
]

解决方案(MongoDB 4.0兼容)

使用MongoDB聚合框架,通过$unwind和$replaceRoot组合实现需求:

db.yourCollectionName.aggregate([
  // 展开Components数组,每个数组元素生成独立文档
  { $unwind: "$Components" },
  // 合并父文档_id与子文档字段,生成新的根文档
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          { _id: "$_id" },
          "$Components"
        ]
      }
    }
  }
])

步骤说明

  • $unwind:将每个父文档中的Components数组拆分为多条文档,每条文档对应数组中的一个子元素,同时保留父文档的所有字段。
  • $replaceRoot + $mergeObjects:将父文档的_id与子文档的FieldA、FieldB合并为新的根文档,自动丢弃不需要的Hash和原Components字段。

如果需要更基础的写法(兼容更低版本),也可以用$project手动指定字段:

db.yourCollectionName.aggregate([
  { $unwind: "$Components" },
  {
    $project: {
      _id: 1,
      FieldA: "$Components.FieldA",
      FieldB: "$Components.FieldB"
    }
  }
])

内容的提问来源于stack exchange,提问作者Nicolas Dias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:15:42