Node.js 如何使用聚合管道更新多个文档,并在对象属性值未找到项时在数组中插入项
我是MongoDB的新手,我需要对我的收藏进行一些复杂的更新操作 我有这样的收藏:Node.js 如何使用聚合管道更新多个文档,并在对象属性值未找到项时在数组中插入项,node.js,mongodb,mongodb-query,Node.js,Mongodb,Mongodb Query,我是MongoDB的新手,我需要对我的收藏进行一些复杂的更新操作 我有这样的收藏: [ { "Id": 1, "extension": [ { "key": "Name", "value": "Bob" }, { "key": "Age"
[
{
"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项。一个带有键扩展
和值“Default”的项目,另一个带有键Name
和值99的项目Age
- 文档在其
数组中缺少键为扩展名
的项。我想插入一个带有键名称
名称
和值“Default”的项
- 文档的
数组中缺少键为扩展名
的项。我想插入一个带有键Age
和值99的项目Age
- 一种文档,在其扩展数组中已经有一个键为
的项和一个键为名称
的项。我不想更新这些年龄
{
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 } } }
}
}
] )