MongoDB: Как обновить несколько документов с помощью одной команды? - PullRequest
112 голосов
/ 16 ноября 2009

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

> 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

Я знаю, что могу проходить и продолжать обновлять, пока все они не изменятся, но это кажется ужасно неэффективным. Есть ли лучший способ?

Ответы [ 10 ]

193 голосов
/ 16 ноября 2009

Несколько обновлений было добавлено недавно, поэтому доступно только в разрабатываемых версиях (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!"}})
31 голосов
/ 16 декабря 2013

ОБНОВЛЕНИЕ начиная с V2.2, функция обновления имеет следующий вид:

 db.collection.update(
   <query>,
   <update>,
   { upsert: <boolean>, multi: <boolean> }
)

Выбранный ответ больше не применяется.

https://docs.mongodb.com/manual/reference/method/db.collection.update/

12 голосов
/ 30 октября 2014

Для Монго версия> 2.2 , добавьте поле multi и установите для него значение true

db.Collection.update({query}, 
                 {$set: {field1: "f1", field2: "f2"}},
                 {multi: true })
7 голосов
/ 08 января 2013

Я создал способ сделать это с помощью лучшего интерфейса.

  • db.collection.find({ ... }).update({ ... }) - несколько обновлений
  • db.collection.find({ ... }).replace({ ... }) - однократная замена
  • db.collection.find({ ... }).upsert({ ... }) - одиночный уперт
  • db.collection.find({ ... }).remove() - удаление нескольких

Вы также можете применить ограничение, пропустить, отсортировать обновления и удалить их, предварительно связав их в цепочку.

Если вам интересно, посмотрите Mongo-Hacker

4 голосов
/ 21 июня 2016

В клиенте MongoDB введите:

db.Collection.updateMany({}, $set: {field1: 'field1', field2: 'field2'})

Новое в версии 3.2

Params ::

{}:  select all records updated

Аргумент ключевого слова multi не принят

3 голосов
/ 08 июня 2015

MongoDB найдет только один соответствующий документ, который соответствует критериям запроса, когда вы отправляете команду обновления, в зависимости от того, какой документ соответствует первому, обновляется, даже если есть больше документов, которые соответствуют критериям, будут игнорироваться.

, чтобы преодолеть это, мы можем указать опцию «MULTI» в вашем заявлении на обновление, что означает обновление всех тех документов, которые соответствуют критериям запроса. просканируйте все документы в коллекции, чтобы найти те, которые соответствуют критериям, и обновите:

db.test.update({"foo":"bar"},{"$set":{"test":"success!"}}, {multi:true} )
1 голос
/ 27 апреля 2015

У меня была такая же проблема, и я нашел решение, и оно работает как шарм

просто установите флаг multi на true, как это:

 db.Collection.update(
                {_id_receiver: id_receiver},
               {$set: {is_showed: true}},
                {multi: true}   /* --> multiple update */
            , function (err, updated) {...});

Надеюсь, это поможет:)

0 голосов
/ 25 декабря 2017

Все последние версии mongodb updateMany () работает нормально

db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});
0 голосов
/ 24 марта 2016

Вы можете использовать.

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  `
0 голосов
/ 07 февраля 2015

Спасибо, что поделились этим, я использовал с 2.6.7, и следующий запрос просто работал,

для всех документов:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:true})

для одного документа:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
...