Ответ 1
.update(Authors:{$elemMatch:{Slug:"slug"}}, {$set: {'Authors.$.Name':"zzz"}});
У меня есть документ, который выглядит так:
{
"_id": 3,
"Slug": "slug",
"Title": "title",
"Authors": [
{
"Slug": "slug",
"Name": "name"
}
]
}
Я хочу обновить все Authors.Name на основе Authors.Slug. Я пробовал это, но это не сработало:
.update({"Authors.Slug":"slug"}, {$set: {"Authors.Name":"zzz"}});
Что я здесь делаю неправильно?
.update(Authors:{$elemMatch:{Slug:"slug"}}, {$set: {'Authors.$.Name':"zzz"}});
Вы можете использовать обновление с фильтрами массива:
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? Однако вы можете примерить оболочку Монго с версией> = 3.6.
да, решение 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"}]})