我正在编写一个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"
  }
  }
}

换句话说,每个值为父字段名称的子文档中都会添加一个新字段. 能做到这一点吗?

推荐答案

使用$objectToArraytags转换为k-v元组array.使用$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
})

Mongo Playground

Mongodb相关问答推荐

Next js、MongoDB和Prisma.包括不为相关字段工作

Spring数据MongoDB(聚合)

如何使用mongodb进行离线开发?

DTO 验证适用于 POST,但不适用于 PUT

MongoDB 根据最新日期查询多个不同的值

查询有关 Go 项目中对象数组的 MongoDb 集合

嵌套数组 $unwind 和 $group 在 mongoDB 中重新组合在一起

使用MongoDB作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

MongoID find 或 find_by

更新 Mongodb 中的多嵌套数组

为什么使用整数作为 pymongo 的键不起作用?

在mongoose中添加多个验证

在mongodb中实现分页

Mongoose 不创建新集合

无法从 MongoDb C# 中的 BsonType ObjectId 反序列化字符串

MongoDB如何判断是否存在

从 nodejs 到 mongodb 或 mongoose 的动态数据库连接

如何通过键名从 mongoDB 中检索值?

MongoDB聚合框架的索引优化

有没有办法防止 MongoDB 向集合名称添加复数形式?