将字段添加到数组 mongoDB 中的对象

时间:2021-06-24 16:43:27

标签: javascript node.js typescript mongodb

我的 mongo 文档中有以下架构:

{
  //more stuff
  arrayExample:[
    {
      //more stuff as well
      field1: "foo"
    },
    {
      //more stuff as well
      field1: "foo"
    },
    {
      //more stuff as well
      field1: "foo"
    },
    //...
  ]
}

我想要做的是向 id: ObjectId() 内的 每个 元素添加一个字段 arrayExample,这样我就可以有如下内容:

    {
  //more stuff
  arrayExample:[
    {
      //more stuff as well
      field1: "foo",
      id: 1
    },
    {
      //more stuff as well
      field1: "foo",
      id: 2
    },
    {
      //more stuff as well
      field1: "foo",
      id: 3
    },
    //...
  ]
}

我尝试通过使用 ma​​p 的聚合来做到这一点,但它并没有像我那样工作。有没有办法做到这一点?非常感谢

1 个答案:

答案 0 :(得分:1)

不幸的是,聚合中没有内置方法来生成 ObjectId(目前)。

但是,您可以使用 $function 运算符并编写自定义代码来执行此操作。

<块引用>

注意:使用 $function 方法会显着影响性能

<块引用>

此外,$function 运算符仅适用于 MongoDB 4.4 及更高版本

以下示例代码适用于 Mongo Shell。通过函数方法中的自定义 JS 代码将 ObjectId() 部分转换为自动 ObjectId 生成器。

db.collection.aggregate([
  {
    "$project": {
      "arrayExample": {
        "$map": {
          "input": "$arrayExample",
          "in": {
            "$mergeObjects": [
              "$$this",
              {
                "$function": {
                  "body": "function() { return {'id': ObjectId()}; }",
                  "args": [],
                  "lang": "js",
                },
              },
            ],
          },
        }
      }
    },
  }
])

Mongo Playground Sample Execution