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

MongoDB聚合管道:为嵌套子文档添加父字段名作为新字段

实现MongoDB聚合管道给tags子文档添加tagName字段

完全可以实现这个需求,你可以通过MongoDB聚合管道里的$objectToArray、$map和$arrayToObject这几个操作符组合来完成,具体实现如下:

聚合管道步骤说明

  • 转换tags为键值对数组:用$objectToArray把tags嵌套对象转成[{k: "tag_xx", v: {...}}]格式的数组,这样就能获取每个子文档对应的父字段名。
  • 遍历添加tagName字段:用$map遍历上述数组,给每个元素的子文档(v字段)新增tagName字段,值取当前元素的k(父字段名称)。
  • 恢复tags对象结构:用$arrayToObject把处理后的数组重新转为嵌套对象,还原tags原本的结构。
  • 保留原文档字段:通过$addFields操作替换原tags字段,同时保留name等其他原有字段。

完整聚合管道代码

db.collection.aggregate([
  {
    $addFields: {
      tags: {
        $arrayToObject: {
          $map: {
            input: { $objectToArray: "$tags" },
            as: "tag",
            in: {
              k: "$$tag.k",
              v: {
                $mergeObjects: [
                  "$$tag.v",
                  { tagName: "$$tag.k" }
                ]
              }
            }
          }
        }
      }
    }
  }
])

执行结果

运行上述管道后,文档会转换成你期望的结构:

[
  {
    "name": "01",
    "tags": {
      "tag_01": {
        "a": "a01-val",
        "b": "b01-val",
        "tagName": "tag_01"
      },
      "tag_02": {
        "a": "a02-val",
        "b": "b02-val",
        "tagName": "tag_02"
      }
    }
  },
  {
    "name": "02",
    "tags": {
      "tag_03": {
        "a": "a03-val",
        "b": "b03-val",
        "tagName": "tag_03"
      },
      "tag_04": {
        "a": "a04-val",
        "b": "b04-val",
        "tagName": "tag_04"
      }
    }
  }
]

内容的提问来源于stack exchange,提问作者Sony Antony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:10:06