Ich war überrascht zu erfahren, 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ß, ich kann durchlaufen und aktualisieren, bis sie alle geändert sind, aber das scheint furchtbar ineffizient zu sein. Gibt es einen besseren Weg?
Kürzlich wurde ein Multi-Update hinzugefügt, das nur in den Entwicklungsversionen (1.1.3) verfügbar ist. Von der Shell aus führen Sie ein Multi-Update durch, indem Sie true
als viertes Argument an update()
übergeben, wobei das dritte Argument das Argument für das Upsert 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 setzen, 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 die neue Methode updateMany()
verwenden, um mehrere Dokumente gleichzeitig zu aktualisieren, ohne dass die separate multi
-Option erforderlich ist.
db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})
UPDATE ab V2.2 hat die Update-Funktion folgende Form:
db.collection.update(
<query>,
<update>,
{ upsert: <boolean>, multi: <boolean> }
)
Die ausgewählte Antwort gilt nicht mehr.
https://docs.mongodb.com/manual/reference/method/db.collection.update/
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 })
Ich habe einen Weg geschaffen, dies mit einer besseren Schnittstelle zu tun.
db.collection.find({ ... }).update({ ... })
- Multi Updatedb.collection.find({ ... }).replace({ ... })
- einmaliger Austauschdb.collection.find({ ... }).upsert({ ... })
- single upssertdb.collection.find({ ... }).remove()
- Multi entfernenSie können auch ein Limit anwenden, überspringen, sortieren und Aktualisierungen entfernen, indem Sie sie vorher verketten.
Wenn Sie interessiert sind, checken Sie aus Mongo-Hacker
MongoDB findet nur ein übereinstimmendes Dokument, das den Abfragekriterien entspricht, wenn Sie einen Aktualisierungsbefehl absetzen. Das Dokument, das zuerst gefunden wird, wird aktualisiert, auch wenn weitere Dokumente vorhanden sind, die den Kriterien entsprechen, werden diese ignoriert.
um dies zu vermeiden, können Sie in Ihrer Aktualisierungsanweisung die Option "MULTI" angeben. Dies bedeutet, dass Sie alle Documnets aktualisieren, die den Abfragekriterien entsprechen. Scannen Sie nach allen documnets in der Sammlung, finden Sie diejenigen, die den Kriterien entsprechen, und aktualisieren Sie:
db.test.update({"foo":"bar"},{"$set":{"test":"success!"}}, {multi:true} )
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 multi
nicht verwendet
Ich hatte das gleiche Problem und fand die Lösung, und es funktioniert wie ein Zauber
setzen Sie 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 :)
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);
}) `
Für Versionen von Mongodb 3.2+ können Sie die Methode updateMany () verwenden, um mehrere Dokumente zu aktualisieren.
http://answerexpress.blogspot.com/2018/09/mongodb-how-to-update-multiple.html
Alle neuesten Versionen von mongodb updateMany () funktionieren einwandfrei
db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});