MongoDB: come aggiornare più documenti con un singolo comando?


145

Sono stato sorpreso di scoprire che il seguente codice di esempio aggiorna solo un singolo documento:

> 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

So di poter fare il ciclo continuo e continuare ad aggiornare fino a quando non saranno tutti cambiati, ma sembra terribilmente inefficiente. C'è un modo migliore?

Risposte:


247

L'aggiornamento multiplo è stato aggiunto di recente, quindi è disponibile solo nelle versioni di sviluppo (1.1.3). Dalla shell si esegue un aggiornamento multiplo passando truecome quarto argomento a update(), dove il terzo argomento è l'argomento upsert:

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

Per le versioni di mongodb 2.2+ è necessario impostare l'opzione multi true per aggiornare più documenti contemporaneamente.

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

Per le versioni di mongodb 3.2+ è inoltre possibile utilizzare un nuovo metodo updateMany()per aggiornare più documenti contemporaneamente, senza la necessità di multiun'opzione separata .

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

3
Non sono sicuro di quando si sia verificato questo cambiamento, ma Mongodb v2.2.2 lo fa in modo leggermente diverso. db.collection.update (<query>, <update>, <options>) dove le opzioni sono un insieme di coppie chiave-valore. Vedi documentazione: docs.mongodb.org/manual/applications/update
TechplexEngineer

3
cosa succede se voglio impostare valori diversi su un documento diverso? c'è un modo alegante di farlo?
zach

Come farlo per oldvalue + "some string"
Mahesh K,

34

A partire da v3.3 È possibile utilizzare updateMany

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

Nella v2.2, la funzione di aggiornamento assume la forma seguente:

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

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


16

Per la versione Mongo> 2.2 , aggiungi un campo multi e impostalo su true

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

7

Ho creato un modo per farlo con un'interfaccia migliore.

  • db.collection.find({ ... }).update({ ... }) - multi aggiornamento
  • db.collection.find({ ... }).replace({ ... }) - sostituzione singola
  • db.collection.find({ ... }).upsert({ ... }) - singolo upsert
  • db.collection.find({ ... }).remove() - multi rimuovi

È inoltre possibile applicare il limite, saltare, ordinare gli aggiornamenti e rimuoverli concatenandoli in anticipo.

Se sei interessato, dai un'occhiata a Mongo-Hacker


1
TypeError: db.getCollection (...). Find (...). Update non è una funzione:?
Anthony,

non ha funzionato 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 :
Prakash Pandey il

4

Nel client MongoDB, digitare:

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

Novità nella versione 3.2

Parametri ::

{}:  select all records updated

Argomento della parola chiave multinon preso


3

MongoDB troverà un solo documento corrispondente che corrisponde ai criteri di query quando si sta eseguendo un comando di aggiornamento, a seconda di quale corrispondenza del documento venga prima aggiornata, anche se ci sono più documenti che corrispondono ai criteri verranno ignorati.

quindi per ovviare a questo possiamo specificare l'opzione "MULTI" nella tua dichiarazione di aggiornamento, il che significa aggiornare tutti quei documnet che corrispondono ai criteri della query. cerca tutti i documnet nella raccolta trovando quelli che soddisfano i criteri e aggiorna:

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

2

Il comando seguente può aggiornare più record di una raccolta

db.collection.update({}, 
{$set:{"field" : "value"}}, 
{ multi: true, upsert: false}
)

1

Ho avuto lo stesso problema e ho trovato la soluzione e funziona come un incantesimo

basta impostare la bandiera multi su true in questo modo:

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

Spero che aiuti :)


1

Per aggiornare l'intera raccolta,

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

0

Puoi usare

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

0

Tutte le ultime versioni di mongodb updateMany () funzionano bene

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

-1

Grazie per averlo condiviso, ho usato con 2.6.7 e la seguente query ha funzionato,

per tutti i documenti:

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

per singolo documento:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.