Mongodb Mongo db 4.2:将数组项的字段替换为匹配文档的另一个字段的值
考虑包含以下文档的mongo集合:Mongodb Mongo db 4.2:将数组项的字段替换为匹配文档的另一个字段的值,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,考虑包含以下文档的mongo集合: { name: "Enrico", age: 32, items: [{ type: "cat", color: "blue" }, { type: "dog", color: "red" }]}, { name: "Francesca", age: 33, items: [{ type: "foo", color: &q
{ name: "Enrico", age: 32, items: [{ type: "cat", color: "blue" }, { type: "dog", color: "red" }]},
{ name: "Francesca", age: 33, items: [{ type: "foo", color: "bar" }, { type: "hello", color: "world" }]},
{ name: "Mario", age: 40, items: [{ type: "cat", color: "green" }, { type: "dog", color: "white" }]}
我需要通过更改匹配数组项的color
属性的值来更新items
数组包含cat
的所有文档。color
属性的新值必须等于匹配文档的name
字段的值
预期结果如下:
{ name: "Enrico", age: 32, items: [{ type: "cat", color: "Enrico" }, { type: "dog", color: "red" }]},
{ name: "Francesca", age: 33, items: [{ type: "foo", color: "bar" }, { type: "hello", color: "world" }]},
{ name: "Mario", age: 40, items: [{ type: "cat", color: "Mario" }, { type: "dog", color: "white" }]}
通过使用,通过将匹配数组项的color
属性替换为静态值,执行类似的更新非常容易。例如,以下更新将用“更改的颜色”
字符串文字替换匹配数组项的color
属性:
db.people.updateMany(
{"items.type": "cat"},
{$set: {"items.$.color": "changed-color"}}
)
这里的问题是,我想使用匹配文档的另一个字段的值(name
)作为匹配数组项的color
属性的新值
我知道,由于MongoDB 4.2,可以在更新查询中使用聚合管道,如文档所述。通过使用,可以将文档字段替换为同一文档的另一个值
因此,我尝试将
使用,我最终得到以下查询:
db.people.updateMany(
{"items.type": "cat"},
[
{$set: {"items.$.color": "$name"}}
]
)
不幸的是,此查询不起作用:mongo db抱怨$set
阶段无效,因为$
符号不能在字段路径内使用。聚合框架似乎不知道数组的$
更新操作符
是否可以使用查询执行我想要的更新?我应该选择脚本吗?你可以试试
要迭代项数组的循环,请检查$map
是否为类型
的条件,然后从cat
返回$name
,并使用颜色
合并对象$mergeObjects
db.people.updateMany(
{ "items.type": "cat" },
[{
$set: {
items: {
$map: {
input: "$items",
in: {
$mergeObjects: [
"$$this",
{
$cond: [
{ $eq: ["$$this.type", "cat"] },
{ color: "$name" },
{}
]
}
]
}
}
}
}
}]
)