我有一个看起来像这样的文件:
{
"_id": 3,
"Slug": "slug",
"Title": "title",
"Authors": [
{
"Slug": "slug",
"Name": "name"
}
]
}
我想基于Authors.Slug更新所有Authors.Name。 我试过这个,但它不起作用:
.update({"Authors.Slug":"slug"}, {$set: {"Authors.Name":"zzz"}});
我在这里做错了什么?
答案 0 :(得分:57)
.update(Authors:{$elemMatch:{Slug:"slug"}}, {$set: {'Authors.$.Name':"zzz"}});
答案 1 :(得分:2)
您可以将update与数组过滤器一起使用:
https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#positional-update-arrayfilters
大概是这样的:
yourcollection.update(
{},
{
"$set": {
"Authors.$[element].Name": "zzz"
}
},
{
"multi": true,
"arrayFilters": [
{ "element.Slug": "slug" }
]
}
)
Ps .: 它无法在Robo3T中运行,如此处所述:Mongodb 3.6.0-rc3 array filters not working? 但是,您可以尝试使用版本大于等于3.6的mongo shell。
答案 2 :(得分:-1)
是的,Rock的解决方案正在运行,P.S Notes在尝试Robo31时确实很有帮助。 如果我们要更新所有 db.collection_name.update({},{$ set:{“ Authors。$ []。Name”:“ zzz”}})
如果我们要使用数组中的匹配对象进行更新 db.collection_name.update({},{$ set:{“ Authors。$ [i] .Name”:“ zzz”}},{arrayFilters:[{“ i.Slug”:“ slug”}]}))< / p>