Frage

Ich war überrascht, dass der folgende Beispiel-Code nur ein einziges 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ß, ich kann Schleife durch und aktualisiert halten, bis sie verändert sind, aber das scheint schrecklich ineffizient. Gibt es einen besseren Weg?

War es hilfreich?

Lösung

Multi Update wurde vor kurzem hinzugefügt, so dass nur in den Entwicklungsversionen verfügbar ist (1.1.3). Von der Shell haben Sie eine Multi-Update von true als viertes Argument zu update() vorbei, wo das das dritte Argument ist die Upsert Argument:

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

Für Versionen von mongodb 2.2+ müssen Sie set-Option Multi wahr mehrere Dokumente auf einmal zu aktualisieren.

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

Für Versionen von mongodb 3.2+ Sie auch neue Methode updateMany() verwenden können mehrere Dokumente auf einmal, ohne die Notwendigkeit separater multi Option.

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

Andere Tipps

UPDATE ab V2.2, die Update-Funktion die folgende Form:

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

Die gewählte Antwort gilt nicht mehr.

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

Mongo version> 2.2 , ein Feld Multi hinzufügen und legen Sie es auf true

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

Ich habe einen Weg geschaffen dies mit einer besseren Schnittstelle zu tun.

  • db.collection.find({ ... }).update({ ... }) - Multi-Update
  • db.collection.find({ ... }).replace({ ... }) - Einzel Ersatz
  • db.collection.find({ ... }).upsert({ ... }) - Einzel Upsert
  • db.collection.find({ ... }).remove() - Multi Entfernen

Sie können auch Grenze gilt, überspringen, sortieren die Updates und entfernt, indem sie in vorher Verkettungs.

Wenn Sie interessiert sind Besuche Mongo-Hacker

Im MongoDB-Client ein:

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

Neu in der Version 3.2

Params ::

{}:  select all records updated

Keyword Argument multi nicht genommen

MongoDB wird nur ein passendes Dokument finden, die die Abfragekriterien entsprechen, wenn Sie ein Update Befehl ausgeben, je nachdem, was Dokument Streichhölzer geschieht zuerst erhalten aktualisiert werden, auch wenn es mehr Dokumente, die den Kriterien entsprechen, werden ignoriert erhalten.

so, dies zu überwinden wir können „MULTI“ Option in der Update-Anweisung angeben, was bedeutet, Aktualisierung alle jene documnets, die die Abfragekriterien entsprechen. Scannen für alle documnets in Sammlung solche, die übereinstimmt, die Kriterien und Update zu finden:

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

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

gesetzt gerade die Flagge Multi wahr wie folgt aus:

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

Ich hoffe, das hilft:)

Sie können use.`

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

Alle aktuellen Versionen von mongodb updateMany () adaequat

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

Vielen Dank für diese teilen, habe ich mit 2.6.7 und folgende Abfrage nur gearbeitet,

für alle Dokumente:

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

für einzelne doc:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top