Как обновить несколько элементов массива в mongodb - PullRequest
167 голосов
/ 12 января 2011

У меня есть документ Mongo, который содержит массив элементов.

Я хотел бы сбросить атрибут .handled всех объектов в массиве, где .profile = XX.

Документ имеет следующую форму:

{
    "_id": ObjectId("4d2d8deff4e6c1d71fc29a07"),
    "user_id": "714638ba-2e08-2168-2b99-00002f3d43c0",
    "events": [{
            "handled": 1,
            "profile": 10,
            "data": "....."
        } {
            "handled": 1,
            "profile": 10,
            "data": "....."
        } {
            "handled": 1,
            "profile": 20,
            "data": "....."
        }
        ...
    ]
}

Итак, я попробовал следующее:

.update({"events.profile":10},{$set:{"events.$.handled":0}},false,true)

Однако он обновляет только первый соответствующий элемент массива в каждом документе. (Это определенное поведение для $ - позиционный оператор .)

Как мне обновить все сопоставленных элементов массива?

Ответы [ 11 ]

0 голосов
/ 02 марта 2015

Я просто хотел добавить другое решение, которое сработало бы для меня и довольно просто.Здесь это просто массив тегов (строк), поэтому чтобы обновить тег с именем «test» до «change», просто сделайте следующее:

myDocuments.find({tags: "test" }, {fields: {_id: 1}}).forEach(function (doc) {
    myDocuments.update(
        {_id: doc._id, tags: "test"}, 
        {$set:{'tags.$': "changed"}});
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...