获取文档字段名称并将它们添加为聚合中的嵌套字段

问题描述 投票:0回答:1

我正在编写一个 mongodb 聚合管道。 我的文件格式如下:

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

我的管道应生成如下文档:

{
  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"
  }
  }
}

换句话说,每个子文档中都会添加一个新字段,其值为父字段的名称。 可以这样做吗?

mongodb aggregation-framework
1个回答
0
投票

使用

$objectToArray
tags
转换为 k-v 元组数组。使用
$map
迭代数组元素,并使用
$mergeObjects
使用
k
设置字段。然后使用
$arrayToObject
恢复到原始对象形式。

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

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.