Проблемы с множественным обновлением в MongoDb

У меня есть структура монго, как это:

{
        "_id" : ObjectId("51596b7e469b9c3816000001"),
        "company" : {
                "_id" : "ade2fd0ec9b8b5e9152e0155",
                "title" : "LO3426546457"
        },
}
{
        "_id" : ObjectId("51596cef469b9c3816000008"),
        "company" : {
                "_id" : "ade2fd0ec9b8b5e9152e0155",
                "title" : "LO3426546457"
        },
}
{
        "_id" : ObjectId("51596cc3469b9c3816000007"),
        "company" : {
                "_id" : "ade2fd0ec9b8b5e9152e0155",
                "title" : "LO3426546457"
        }        
}

И я хочу изменить все поля «заголовок» для объектов с определенным «_id». Мне нравится это:

Collections.UsersCollection.update({
    'company._id': 'ade2fd0ec9b8b5e9152e0155'
}, {
    $set: {
        'company': { _id: 'ade2fd0ec9b8b5e9152e0155', title: 'blablabla' }
        // I also tried: 'company.title': 'blablabla'
    }
}, false, true);

И после выполнения этого кода в Node.js (я использую node-mongodb-native) монго обновляет только один документ.

Но если я выполняю эту команду в Mongo Shell (mongo.exe), все работает нормально и обновляет все документы.

В чем проблема?


person msmirnov    schedule 01.04.2013    source источник
comment
Вы сказали, что команда работает в оболочке монго, но где она не работает?   -  person user20140268    schedule 01.04.2013
comment
Ой, извини. Это не работает в моем коде Node.js. Я использую этот модуль: github.com/mongodb/node-mongodb-native   -  person msmirnov    schedule 01.04.2013


Ответы (2)


По умолчанию монго обновляет только один документ. http://docs.mongodb.org/manual/reference/method/db.collection.update/

Используйте несколько опций для обновления нескольких документов.

person Biswanath    schedule 01.04.2013
comment
Будучи необязательным параметром, я думаю, что ваш true может быть истолкован как true для upsert. Я попробую с явным {multi: true}, если вы еще не пробовали. - person Biswanath; 01.04.2013
comment
Я пробовал этот код, но ничего не изменилось. Collections.UsersCollection.update({ 'company._id': id }, { $set: { 'company.title': title } }, {upsert: false}, {multi: true}); - person msmirnov; 01.04.2013
comment
Вы должны передавать свои параметры как один объект Collections.UsersCollection.update({ 'company._id': id }, { $set: { 'company.title': title } }, {upsert: false, multi: true}) - person user20140268; 01.04.2013

По умолчанию collection.update() обновляет только один документ, если вам нужно обновить несколько документов, вы должны добавить параметр {multi:1} перед функцией обратного вызова.

person Wale omoAkin    schedule 02.07.2013