it-swarm.com.ru

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

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

> 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

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

98
Luke Dennis

Мульти обновление было добавлено недавно, поэтому доступно только в разрабатываемых версиях (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!"}})
175
mdirolf

UPDATE начиная с V2.2, функция обновления имеет следующий вид:

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

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

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

31
user602525

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

db.Collection.update({query}, 
                 {$set: {field1: "f1", field2: "f2"}},
                 {multi: true })
12
Kartik Singh

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

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

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

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

8
Tyler Brock

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

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

db.test.update({"foo":"bar"},{"$set":{"test":"success!"}}, {multi:true} )
3
Yathish Manjunath

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

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

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

Params ::

{}:  select all records updated

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

3
Boseam

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

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

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

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

1
Amine_Dev

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

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "[email protected]",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  `
0
Jitendra

Для версий mongodb 3.2+ вы можете использовать метод updateMany () для обновления нескольких документов,

http://answerexpress.blogspot.com/2018/09/mongodb-how-to-update-multiple.html

0
Sunil Jose

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

db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});
0
KARTHIKEYAN.A