Подтвердить что ты не робот

Обновление встроенного документа в Mongodb

У меня есть документ, который выглядит так:

{
    "_id": 3,
    "Slug": "slug",
    "Title": "title",
    "Authors": [
        {
            "Slug": "slug",
            "Name": "name"
        }
    ]
}

Я хочу обновить все Authors.Name на основе Authors.Slug. Я пробовал это, но это не сработало:

.update({"Authors.Slug":"slug"}, {$set: {"Authors.Name":"zzz"}});

Что я здесь делаю неправильно?

4b9b3361

Ответ 1

.update(Authors:{$elemMatch:{Slug:"slug"}}, {$set: {'Authors.$.Name':"zzz"}});

Ответ 2

Вы можете использовать обновление с фильтрами массива:
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.

Ответ 3

да, решение 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"}]})

Ref: https://jira.mongodb.org/browse/SERVER-1243