Обновление встроенного свойства документа в Mongodb - PullRequest
28 голосов
/ 20 июля 2011

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

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

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

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

Что я здесь не так делаю?

Ответы [ 2 ]

57 голосов
/ 20 июля 2011
.update(Authors:{$elemMatch:{Slug:"slug"}}, {$set: {'Authors.$.Name':"zzz"}});
2 голосов
/ 13 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...