我有一个类似的文件
"_id" : ObjectId("5b0cf3b77f8b9a0a1330f26s"),
"group" : ObjectId("5b0cf3b77f8b9a0a1330f27f"),
"referrers" : [
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20c")
},
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20d")
},
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20e")
}
]
现在,我需要更新一个新项目{"canAddUse" : true
},以引用所有文档中的嵌套数组。输出应为:
"_id" : ObjectId("5b0cf3b77f8b9a0a1330f26s"),
"group" : ObjectId("5b0cf3b77f8b9a0a1330f27f"),
"referrers" : [
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20c"),
"canAddUser" : true
},
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20d"),
"canAddUser" : true
},
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20e"),
"canAddUser" : true
}
]
我应该如何运行查询以一次更新多个文档中的内容?
答案 0 :(得分:0)
您可以使用$[] positional all运算符(MongoDB 3.6+)更新数组中的所有元素,并使用multi: true
更新所有文档。
db.col.update({}, { $set: { "referrers.$[].canAddUser": true } }, { multi: true })
对于较低的MongoDB版本,您可以使用$addFields覆盖现有字段,并使用$out覆盖现有集合:
db.colname.aggregate([
{
$addFields: {
referrers: {
$map: {
input: "$referrers",
as: "r",
in: { referrer_id: "$$r.referrer_id", canAddUser: true }
}
}
}
},
{
$out: "colname"
}
])