Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用聚合管道更新多个文档,并在对象属性值未找到项时在数组中插入项_Node.js_Mongodb_Mongodb Query - Fatal编程技术网

Node.js 如何使用聚合管道更新多个文档,并在对象属性值未找到项时在数组中插入项

Node.js 如何使用聚合管道更新多个文档,并在对象属性值未找到项时在数组中插入项,node.js,mongodb,mongodb-query,Node.js,Mongodb,Mongodb Query,我是MongoDB的新手,我需要对我的收藏进行一些复杂的更新操作 我有这样的收藏: [ { "Id": 1, "extension": [ { "key": "Name", "value": "Bob" }, { "key": "Age"

我是MongoDB的新手,我需要对我的收藏进行一些复杂的更新操作

我有这样的收藏:

[
  {
    "Id": 1,
    "extension": [
      {
        "key": "Name",
        "value": "Bob"
      },
      {
        "key": "Age",
        "value": 20
      }
    ]
  },
  {
    "Id": 2,
    "extension": [
      {
        "key": "Name",
        "value": "Sam"
      }
    ]
  },
  {
    "Id": 3,
    "extension": [
      {
        "key": "Age",
        "value": 25
      }
    ]
  },
  {
    "Id": 4
  }
]
我想更新我的收藏,以便每个文档都以一个
扩展名
数组结尾,该数组包含一个键为
名称
的项,以及一个键为
年龄
的项

我的收藏中有4种类型的现有文档:

[
  {
    "Id": 1,
    "extension": [
      {
        "key": "Name",
        "value": "Bob"
      },
      {
        "key": "Age",
        "value": 20
      }
    ]
  },
  {
    "Id": 2,
    "extension": [
      {
        "key": "Name",
        "value": "Sam"
      }
    ]
  },
  {
    "Id": 3,
    "extension": [
      {
        "key": "Age",
        "value": 25
      }
    ]
  },
  {
    "Id": 4
  }
]
  • 文档完全缺少
    扩展名
    属性。对于这些,我想创建
    扩展
    数组并插入2项。一个带有键
    Name
    和值“Default”的项目,另一个带有键
    Age
    和值99的项目
  • 文档在其
    扩展名
    数组中缺少键为
    名称
    的项。我想插入一个带有键
    名称
    和值“Default”的项
  • 文档的
    扩展名
    数组中缺少键为
    Age
    的项。我想插入一个带有键
    Age
    和值99的项目
  • 一种文档,在其扩展数组中已经有一个键为
    名称
    的项和一个键为
    年龄
    的项。我不想更新这些
我想使用聚合管道来更新我的集合,但我不确定使用什么作为查询和更新命令来实现这一点

我想我需要这样的东西:

{
    update: "MyCollection",
    updates: [
        {
            q: { xxxxxxxxxx },
            u: [ 
                    extensions: {
                        yyyyyyyyyyyyyy
                    }
                ],
            multi: true
        }
    ]
}
最后,我上面的收藏在更新后看起来是这样的:

[
  {
    "Id": 1,
    "extension": [
      {
        "key": "Name",
        "value": "Bob"
      },
      {
        "key": "Age",
        "value": 20
      }
    ]
  },
  {
    "Id": 2,
    "extension": [
      {
        "key": "Name",
        "value": "Sam"
      },
      {
        "key": "Age",
        "value": 99
      }
    ]
  },
  {
    "Id": 3,
    "extension": [
      {
        "key": "Name",
        "value": "Default"
      },
      {
        "key": "Age",
        "value": 25
      }
    ]
  },
  {
    "Id": 4,
    "extension": [
      {
        "key": "Name",
        "value": "Default"
      },
      {
        "key": "Age",
        "value": 99
      }
    ]
  }
]
备选方案-1 您可以通过运行两个更新查询来实现这一点

1)添加年龄

演示-


2)添加名称

演示-


备选方案2 您可以将它们组合起来,并使用

备选方案-1 您可以通过运行两个更新查询来实现这一点

1)添加年龄

演示-


2)添加名称

演示-


备选方案2 您可以将它们组合起来,并使用


您想在一个查询中完成所有操作吗?@Nur感谢您的回复。我不介意做很多更新,尽管我希望使用最有效的方法来提高性能,因为我有超过200000个文档要更新update@Nur是的,我很乐意尝试:DIts如此简单,尝试,使用查询运算符,要推送数据,请使用更新operator@Nur这就是我在语法和构建正确查询方面遇到困难的地方。您是否试图在一个查询中完成所有操作?@Nur谢谢您的回答。我不介意做很多更新,尽管我希望使用最有效的方法来提高性能,因为我有超过200000个文档要更新update@Nur是的,我很乐意尝试:DIts如此简单,尝试,使用查询运算符,要推送数据,请使用更新operator@Nur这就是我在语法和构建正确查询方面遇到困难的地方。这看起来很干净!谢谢你,我会试试的:)希望速度快一点,太好了!我将对两者进行基准测试:)非常感谢@ibiza,还记得在这里报告您的基准测试结果!这看起来很干净!谢谢你,我会试试的:)希望速度快一点,太好了!我将对两者进行基准测试:)非常感谢@ibiza,还记得在这里报告您的基准测试结果!
db.collection.update(
    { "extension.key": { $ne: "Name" } },
    { $push: { "extension": { "key": "Name", "value": "Default" } } },
    { multi: true }
)
db.collection.bulkWrite( [
    { 
        updateMany :
        {
         "filter": { "extension.key": { $ne: "Name" } },
         "update": { $push: { "extension": { "key": "Name", "value": "Default" } } }
        }
   },
   { 
        updateMany :
        {
         "filter": { "extension.key": { $ne: "Age" } },
         "update": { $push: { "extension": { "key": "Age", "value": 99 } } }
        }
   }
] )