МонгоБД:Как обновить несколько документов с помощью одной команды?
Вопрос
Я был удивлен, обнаружив, что следующий пример кода обновляет только один документ:
> db.test.save({"_id":1, "foo":"bar"});
> db.test.save({"_id":2, "foo":"bar"});
> db.test.update({"foo":"bar"}, {"$set":{"test":"success!"}});
> db.test.find({"test":"success!"}).count();
1
Я знаю, что могу пройти через цикл и продолжать обновлять, пока все они не будут изменены, но это кажется ужасно неэффективным.Есть ли способ лучше?
Решение
Мультиобновление было добавлено недавно, поэтому доступно только в версиях для разработки (1.1.3).Из оболочки вы выполняете множественное обновление, передав true
в качестве четвертого аргумента update()
, где третий аргумент — это аргумент upsert:
db.test.update({foo: "bar"}, {$set: {test: "success!"}}, false, true);
Для версий mongodb 2.2+ вам необходимо установить опцию multi true, чтобы обновить несколько документов одновременно.
db.test.update({foo: "bar"}, {$set: {test: "success!"}}, {multi: true})
Для версий mongodb 3.2+ вы также можете использовать новый метод. updateMany()
обновлять несколько документов одновременно без необходимости отдельного multi
вариант.
db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})
Другие советы
ОБНОВЛЕНИЕ Начиная с версии 2.2, функция обновления имеет следующий вид:
db.collection.update(
<query>,
<update>,
{ upsert: <boolean>, multi: <boolean> }
)
Выбранный ответ больше не применяется.
https://docs.mongodb.com/manual/reference/method/db.collection.update/
Для Версия Монго > 2.2, добавьте поле multi и установите для него значение true
db.Collection.update({query},
{$set: {field1: "f1", field2: "f2"}},
{multi: true })
Я создал способ сделать это с помощью лучшего интерфейса.
db.collection.find({ ... }).update({ ... })
-- мультиобновлениеdb.collection.find({ ... }).replace({ ... })
-- однократная заменаdb.collection.find({ ... }).upsert({ ... })
-- одиночное обновлениеdb.collection.find({ ... }).remove()
-- множественное удаление
Вы также можете применять ограничение, пропуск, сортировку обновлений и удалений, предварительно связав их в цепочку.
Если вам интересно, посмотрите Монго-Хакер
В клиенте MongoDB введите:
db.Collection.updateMany({}, $set: {field1: 'field1', field2: 'field2'})
Новое в версии 3.2
Параметры::
{}: select all records updated
Аргумент ключевого слова multi
не принято
MongoDB найдет только один соответствующий документ, который соответствует критериям запроса, когда вы вводите команду обновления, какой бы документ ни совпадал первым, он будет обновлен, даже если есть больше документов, соответствующих критериям, будут игнорироваться.
поэтому, чтобы преодолеть эту проблему, мы можем указать опцию «MULTI» в вашем операторе обновления, что означает обновление всех тех документов, которые соответствуют критериям запроса.просканируйте все документы в коллекции, найдите те, которые соответствуют критериям, и обновите:
db.test.update({"foo":"bar"},{"$set":{"test":"success!"}}, {multi:true} )
У меня была та же проблема, и я нашел решение, и оно работает как шарм
просто установите для флага multi значение true следующим образом:
db.Collection.update(
{_id_receiver: id_receiver},
{$set: {is_showed: true}},
{multi: true} /* --> multiple update */
, function (err, updated) {...});
Надеюсь, это поможет :)
Вы можете использовать.`
Model.update({
'type': "newuser"
}, {
$set: {
email: "abc@gmail.com",
phoneNumber:"0123456789"
}
}, {
multi: true
},
function(err, result) {
console.log(result);
console.log(err);
}) `
Все последние версии mongodb updateMany() работает нормально
db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});
Спасибо, что поделились этим, я использовал версию 2.6.7, и следующий запрос только что сработал:
для всех документов:
db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:true})
для одного документа:
db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})