MongoDB: Wie aktualisiere ich mehrere Dokumente mit einem einzigen Befehl?

143

Ich war überrascht, dass der folgende Beispielcode nur ein einzelnes Dokument aktualisiert:

> 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

Ich weiß, dass ich mich durchlaufen und weiter aktualisieren kann, bis sie alle geändert sind, aber das scheint furchtbar ineffizient zu sein. Gibt es einen besseren Weg?

Luke Dennis
quelle

Antworten:

247

Das Multi-Update wurde kürzlich hinzugefügt und ist daher nur in den Entwicklungsversionen (1.1.3) verfügbar. Von der Shell aus führen Sie eine Mehrfachaktualisierung durch, indem Sie trueals viertes Argument an übergeben update(), wobei das dritte Argument das Upsert-Argument ist:

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

Für Versionen von mongodb 2.2+ müssen Sie die Option multi true festlegen, um mehrere Dokumente gleichzeitig zu aktualisieren.

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

Für Versionen von Mongodb 3.2+ können Sie auch eine neue Methode verwenden updateMany(), um mehrere Dokumente gleichzeitig zu aktualisieren, ohne dass eine separate multiOption erforderlich ist .

db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})
mdirolf
quelle
3
Ich bin mir nicht sicher, wann diese Änderung stattgefunden hat, aber Mongodb v2.2.2 macht das etwas anders. db.collection.update (<Abfrage>, <Update>, <Optionen>) wobei Optionen eine Reihe von Schlüsselwertpaaren sind. Siehe Dokumentation: docs.mongodb.org/manual/applications/update
TechplexEngineer
3
Was ist, wenn ich unterschiedliche Werte für unterschiedliche Dokumente festlegen möchte? Gibt es einen aleganten Weg, dies zu tun?
Zach
Wie man es für oldvalue + "some string" macht
Mahesh K
34

Ab Version 3.3 können Sie updateMany verwenden

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

In Version 2.2 hat die Aktualisierungsfunktion die folgende Form:

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

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

user602525
quelle
16

Fügen Sie für Mongo Version> 2.2 ein Feld Multi hinzu und setzen Sie es auf true

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

Ich habe einen Weg gefunden, dies mit einer besseren Oberfläche zu tun.

  • db.collection.find({ ... }).update({ ... }) - Multi Update
  • db.collection.find({ ... }).replace({ ... }) - Einzelersatz
  • db.collection.find({ ... }).upsert({ ... }) - Single Upsert
  • db.collection.find({ ... }).remove() - mehrfach entfernen

Sie können auch Limits anwenden, überspringen, sortieren und entfernen, indem Sie sie vorher verketten.

Wenn Sie interessiert sind, schauen Sie sich Mongo-Hacker an

Tyler Brock
quelle
1
TypeError: db.getCollection (...). Find (...). Update ist keine Funktion :?
Anthony
hat nicht funktioniert 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
4

Geben Sie im MongoDB-Client Folgendes ein:

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

Neu in Version 3.2

Params ::

{}:  select all records updated

Schlüsselwortargument multinicht übernommen

Boseam
quelle
3

MongoDB findet nur ein übereinstimmendes Dokument, das den Abfragekriterien entspricht, wenn Sie einen Aktualisierungsbefehl ausgeben. Das Dokument, das zuerst übereinstimmt, wird aktualisiert, auch wenn mehr Dokumente vorhanden sind, die den Kriterien entsprechen.

Um dies zu überwinden, können wir in Ihrer Update-Anweisung die Option "MULTI" angeben, dh alle Documnets aktualisieren, die den Abfragekriterien entsprechen. Scannen Sie nach allen Dokumenten in der Sammlung, um diejenigen zu finden, die den Kriterien entsprechen, und aktualisieren Sie:

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

Der folgende Befehl kann mehrere Datensätze einer Sammlung aktualisieren

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

Ich hatte das gleiche Problem und fand die Lösung, und es funktioniert wie ein Zauber

Setzen Sie einfach das Flag multi wie folgt auf true:

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

Ich hoffe das hilft :)

Amine_Dev
quelle
1

So aktualisieren Sie die gesamte Sammlung:

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

Sie können verwenden. "

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

Alle aktuellen Versionen von mongodb updateMany () funktioniert gut

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

Vielen Dank für das Teilen, ich habe mit 2.6.7 verwendet und folgende Abfrage hat gerade funktioniert,

für alle Dokumente:

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

für einzelne Dokumente:

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