Domanda

Sono rimasto sorpreso di scoprire che il seguente codice di esempio viene aggiornato un solo 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 che posso scorrere e tenere l'aggiornamento fino a quando sono tutti cambiati, ma che sembra terribilmente inefficiente. C'è un modo migliore?

È stato utile?

Soluzione

Multi aggiornamento è stato aggiunto di recente, quindi è disponibile solo nelle versioni di sviluppo (1.1.3). Dalla shell si fa un multi aggiornamento passando true come quarto argomento a update(), dove il 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 più vera per aggiornare più documenti contemporaneamente.

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

Per le versioni di MongoDB 3.2+ è possibile anche utilizzare il metodo nuovo updateMany() per aggiornare più documenti in una sola volta, senza la necessità di opzione multi separato.

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

Altri suggerimenti

UPDATE partire V2.2, la funzione di aggiornamento assume la seguente forma:

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

La risposta selezionato non si applica più.

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

versione Mongo> 2.2 , aggiungere un campo a più e impostarla su true

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

Ho creato un modo per fare questo con una migliore interfaccia.

  • db.collection.find({ ... }).update({ ... }) - Multi update
  • db.collection.find({ ... }).replace({ ... }) - singola sostituzione
  • db.collection.find({ ... }).upsert({ ... }) - singola upsert
  • db.collection.find({ ... }).remove() - Multi Rimuovi

È anche possibile applicare limite, saltare, sorta agli aggiornamenti e rimuove da loro concatenamento in anticipo.

Se siete interessati, controlla Mongo-Hacker

Nel MongoDB Cliente, tipo:

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

Nuovo nella versione 3.2

Params ::

{}:  select all records updated

Chiave argomento multi non godute

MongoDB troverà un solo documento di corrispondenza che corrisponde ai criteri di query quando si è l'emissione di un comando di aggiornamento, a seconda di quale documento corrisponde primo sembra essere ottenere aggiornato, anche se ci sono più documenti che corrisponde ai criteri andranno ignorate.

in modo di superare questa opzione è possibile specificare "MULTI" nella sua dichiarazione di aggiornamento, il che significa aggiornare tutti quei documnets che corrisponde ai criteri di query. eseguire la scansione per tutti i documnets della collezione trovare quelle che corrispondono ai criteri e aggiornamento:

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

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

è sufficiente impostare la Multi bandiera a true in questo modo:

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

Mi auguro che aiuta:)

È possibile use.`

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

Tutte le ultime versioni di MongoDB updateMany () sta lavorando bene

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

Grazie per aver condiviso questo, ho usato con 2.6.7 e seguente query solo lavorato,

per tutti i documenti:

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

per la singola doc:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top