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?

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!"}})

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/


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 })

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


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


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} )

2

Der folgende Befehl kann mehrere Datensätze einer Sammlung aktualisieren

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

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 :)


1

So aktualisieren Sie die gesamte Sammlung:

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

0

Sie können verwenden. "

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

0

Alle aktuellen Versionen von mongodb updateMany () funktioniert gut

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

-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})
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.