МонгоБД:Как обновить несколько документов с помощью одной команды?

StackOverflow https://stackoverflow.com/questions/1740023

  •  20-09-2019
  •  | 
  •  

Вопрос

Я был удивлен, обнаружив, что следующий пример кода обновляет только один документ:

> 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})
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top