【问题标题】:Add a field to an object in an array mongoDB向数组 mongoDB 中的对象添加字段
【发布时间】:2021-06-24 16:43:27
【问题描述】:

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

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

我想要做的是在arrayExample 内的each 元素中添加一个字段id: ObjectId(),这样我就可以得到如下内容:

    {
  //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 进行聚合,但它并没有像我那样工作。有没有办法做到这一点?非常感谢

【问题讨论】:

    标签: javascript node.js typescript mongodb


    【解决方案1】:

    不幸的是,Aggregation 中没有内置方法来生成 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

    【讨论】:

    • 我注意到这有一个小问题.. ObjectId 在所有对象中都是相同的。我通过 Compass 进行了此查询
    • @RafDor,你说得对,我之前没有考虑过这个问题。道歉。我已经更新了答案。
    • 再次感谢您!
    • 很高兴它帮助了你。请记住,这比较慢。如果我遇到更优化的解决方案,将更新答案。
    • 别担心,用它一次更新一些大文件。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2020-04-28
    • 2020-11-25
    • 1970-01-01
    • 2022-07-25
    • 2021-07-26
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多