MongoDB: Як оновити кілька документів однією командою?


145

Я з подивом виявив, що наступний приклад коду оновлює лише один документ:

> 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

Я знаю, що я можу переглядати та продовжувати оновлення, поки всі вони не зміниться, але це здається жахливо неефективним. Чи є кращий спосіб?

Відповіді:


247

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

3
Я не впевнений, коли ця зміна відбулася, але Mongodb v2.2.2 робить це дещо інакше. db.collection.update (<запит>, <оновити>, <варіанти>), де параметри - це набір пар ключових значень. Дивіться документацію: docs.mongodb.org/manual/applications/update
TechplexEngineer

3
що робити, якщо я хочу встановити різні значення для іншого документа? чи є елегантний спосіб цього зробити?
зач

Як зробити це для oldvalue + "деякий рядок"
Mahesh K

34

Починаючи з v3.3 Ви можете використовувати updateMany

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

В v2.2 функція оновлення приймає таку форму:

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

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


16

Для версії Mongo> 2.2 додайте поле multi та встановіть його на true

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

7

Я створив спосіб зробити це з кращим інтерфейсом.

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

Ви також можете застосувати обмеження, пропустити, сортувати до оновлень та видалень, попередньо прив’язавши їх.

Якщо вас цікавить, перегляньте Монго-Хакер


1
TypeError: db.getCollection (...). Find (...) .оновлення не є функцією:?
Антоній

не працював db.userActivity.find({ 'appId' : 1234, 'status' : 1}).update({ $set: { 'status': 1 } }); 2017-06-05T17:47:10.038+0530 E QUERY [thread1] TypeError: db.userActivity.find(...).update is not a function :
Пракаш Пандей

4

У Клієнті MongoDB введіть:

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

Нове у версії 3.2

Параметри ::

{}:  select all records updated

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


3

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

щоб подолати це, ми можемо вказати опцію "MULTI" у вашій заяві оновлення, тобто оновити всі ті документи, які відповідають критеріям запиту. сканувати всі документи в колекції, знаходячи ті, які відповідають критеріям та оновити:

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


1

У мене була така ж проблема, і я знайшов рішення, і це працює як шарм

просто встановіть прапор мульти таким чином:

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

Я сподіваюся, що це допомагає :)


1

Щоб оновити всю колекцію,

db.getCollection('collection_name').update({},
{$set: {"field1" : "value1", "field2" : "value2", "field3" : "value3"}},
{multi: true })

0

Можна використовувати.`

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  `

0

Всі останні версії mongodb updateMany () працюють нормально

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

-1

Дякуємо, що поділилися цим, я використовував 2.6.7 і наступний запит просто працював,

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

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

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

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.