考虑一下我们有如下文件:
{
"_id" : 1,
"books" : [
{ "a" : 80, "b" : 75 },
{ "a" : 85, "b" : 100 },
{ "a" : 85, "b" : 100 }
]
}
{
"_id" : 2,
"books" : [
{ "a" : 90, "b" : 95 },
{ "a" : 95, "b" : 200 },
{ "a" : 85, "b" : 200 }
]
}
我希望查询将books数组中的每个元素的所有“ a”值替换为“ b”值。
我尝试了以下查询:
db.test.updateMany({}, {$set: {"books.$[].a": "$books.$.b"}}, {multi: true, upsert: true})
但是它正在为所有“ a”值而不是“ b”值设置$books.$.b
的文字字符串。
你能告诉我我在做什么错吗?
答案 0 :(得分:0)
您可以尝试update with aggregation pipeline从MongoDB 4.2开始,
$map
迭代books
数组的循环并在更改中进行更新以更新值a
并使用$mergeObjects
将对象与当前对象合并db.test.updateMany({},
[{
$set: {
books: {
$map: {
input: "$books",
in: {
$mergeObjects: ["$$this", { a: "$$this.b" }]
}
}
}
}
}]
)
确保您的mongo shell版本大于4.2