Kurs
Bei MongoDB kann es Szenarien geben, in denen du mehrere Dokumente mit einer einzigen Operation aktualisieren möchtest. Du könntest zwar die Dokumente in einer Schleife durchgehen und sie einzeln aktualisieren, aber updateMany
bietet eine schnellere und effizientere Lösung.
In diesem kurzen Lernprogramm lernen wir, wie wir den updateMany-Operator in MongoDB verwenden und Abfragen optimieren, um die bestmögliche Leistung zu erzielen.
Um eine solide Grundlage für die Datenverarbeitung in MongoDB mit Python zu schaffen, solltest du den Kurs Einführung in MongoDB in Python besuchen.
Ein praktisches Beispiel für das Aktualisieren mehrerer MongoDB-Dokumente
Um dieses Konzept zu veranschaulichen, nehmen wir ein praktisches Beispiel, bei dem du vielleicht mehr als ein Dokument gleichzeitig aktualisieren möchtest.
Nimm die folgenden Daten als Grundlage für unser Beispiel:
[
{ "name": "Nic Raboy", "title": "Master of Shenanigans", "salary": 50000, "last_raise_date": new Date("2013-06-01") },
{ "name": "Megan Grant", "title": "Word Wrangler", "salary": 125000, "last_raise_date": new Date("2020-12-01") },
{ "name": "Tony Kim", "title": "Alliance Czar", "salary": 80000, "last_raise_date": new Date("2025-02-01") },
];
Im obigen JSON haben wir drei Mitarbeiter in einem fiktiven Unternehmen. Das Unternehmen will allen eine Gehaltserhöhung zukommen lassen, die eine gewisse Zeit lang keine Gehaltsanpassung erhalten haben.
Um alle, die sich qualifizieren, zu aktualisieren, können wir den updateMany
Operator in MongoDB verwenden. Um unsere Aufgabe zu erfüllen, könnten wir mit einer Anweisung enden, die wie die folgende aussieht:
db.employees.updateMany(
{
"last_raise_date": {
"$lte": new Date("2024-01-01")
}
},
{
"$mul": { "salary": 1.06 },
"$set": { "last_raise_date": new Date() }
}
);
Was bewirkt die obige updateMany
Operation?
Wenn wir einen Schritt zurückgehen, benötigt der updateMany
Operator zwei Parameter und einen optionalen dritten Parameter.
- Der erste Parameter ist ein Objekt, das die Daten repräsentiert, die wir filtern wollen.
- Der zweite Parameter ist die Änderung, die wir an den im Filter gefundenen Ergebnissen vornehmen wollen.
- Der optionale dritte Parameter könnte
{ “upsert”: true }
sein, der ein Dokument einfügen würde, wenn es keine Treffer gibt.
Zu diesem Zweck filtern wir zunächst nach allen Dokumenten, deren last_raise_date
vor dem "2024-01-01" liegt. Wenn wir auf unseren Basisdatensatz zurückblicken, wissen wir, dass zwei der drei Dokumente übereinstimmen:
[
{ "name": "Nic Raboy", "title": "Master of Shenanigans", "salary": 50000, "last_raise_date": new Date("2013-06-01") },
{ "name": "Megan Grant", "title": "Word Wrangler", "salary": 125000, "last_raise_date": new Date("2020-12-01") }
];
Basierend auf dem Parameter Änderungskriterien werden zwei verschiedene Änderungen an den gefilterten Dokumenten vorgenommen.
"$mul": { "salary": 1.06 },
Zuerst benutzen wir den $mul
Operator, um eines unserer Felder mit einem Wert zu multiplizieren. In unserem Beispiel wollen wir jedem qualifizierten Mitarbeiter eine Gehaltserhöhung von 6 % geben. Das bedeutet, dass wir den aktuellen Wert des Feldes einfach mit 1,06 multiplizieren.
Um die Gehaltsanpassungen zu dokumentieren und gleichzeitig versehentliche Erhöhungen in der Zukunft zu verhindern, wollen wir die last_raise_date
auf das aktuelle Datum aktualisieren:
"$set": { "last_raise_date": new Date() }
Wenn wir unseren updateMany
Vorgang erneut ausführen würden, würde nichts passieren, weil die im Filter gefundene last_raise_date
mit keinem unserer drei Dokumente mehr übereinstimmen würde.
Das ist nur ein Beispiel, aber deine Filterkriterien könnten viel komplexer sein, und auch das, was du ändern willst, könnte komplexer sein, je nach Anwendungsfall.
Steigere die Leistung deines Updates mit einem MongoDB-Index
In unserem Beispiel haben wir mit drei kleinen Dokumenten gearbeitet. Egal, was wir mit unserer Sammlung anstellen, es wird schnell gehen, denn wir werden nicht mit viel arbeiten müssen. Stell dir jedoch eine Produktionsanwendung vor, in der du mit Millionen von Dokumenten arbeitest oder häufig den Aktualisierungsvorgang durchführst.
Wenn wir versuchen würden, den updateMany
Operator auf Millionen von Dokumenten anzuwenden, könnte das einige Zeit dauern, es sei denn, wir hätten einen geeigneten Index für unsere Filterkriterien erstellt.
Um einen Index für unser Beispiel zu erstellen, können wir etwas wie folgt ausführen:
db.employees.createIndex({ "last_raise_date": 1 });
Du kannst überprüfen, ob die Operation updateMany
unseren Index verwendet, indem du Folgendes ausführst:
db.runCommand({
"explain": {
"update": "employees",
"updates": [
{
"q": {
"last_raise_date": {
"$lte": new Date("2024-01-01")
}
},
"u": {
"$mul": { "salary": 1.06 },
"$set": { "last_raise_date": new Date() }
}
}
]
},
"verbosity": "allPlansExecution"
});
Wenn in den Ergebnissen inputStage
"IXSCAN" steht, verwendest du einen Index und maximierst deine updateMany
Leistung. Wenn die inputStage
"COLLSCAN" lautet, dann verwendest du keinen Index und musst möglicherweise überdenken, wie du deinen Index auf der Grundlage deiner Filterkriterien erstellst.
Um Unklarheiten zu beseitigen, verwenden wir runCommand
, um ein Profil unseres Vorgangs der Aktualisierung mehrerer Dokumente zu erstellen. Wenn du keine Profiler-Informationen brauchst, bleib bei der viel einfacheren und eleganteren updateMany
Operation.
Fazit
Mehrere Dokumente in einer einzigen Operation in MongoDB zu aktualisieren, ist keine schwierige Aufgabe, wie wir im Laufe des Tutorials gesehen haben.
Mit dem Operator updateMany
können wir ein Filterkriterium definieren, mit dem wir unsere Dokumente abgleichen, und dann ein Änderungskriterium mit einer Liste von Änderungen, die wir vornehmen müssen. Diese updateMany
Operation kann weiter optimiert werden, indem du sicherstellst, dass du einen richtigen Index hast, der zu deinen Filterkriterien passt.
Wenn du dich zum ersten Mal mit nicht-relationalen Datenbanken beschäftigst, bietet dir der Kurs Einführung in NoSQL einen hilfreichen Überblick über Konzepte wie Dokumentenspeicher.
Werde Dateningenieur
FAQs
Was ist der Unterschied zwischen updateOne und updateMany in MongoDB?
updateOne
ändert das erste passende Dokument, während updateMany
alle Dokumente aktualisiert, die den Filterkriterien entsprechen. Wähle nach dem gewünschten Umfang der Veränderung.
Kann updateMany mit upsert in MongoDB verwendet werden?
Ja, wenn du { upsert: true }
als drittes Argument hinzufügst, wird ein neues Dokument eingefügt, wenn keine Treffer gefunden werden. Es wird jedoch häufiger mit updateOne
verwendet.
Was sind die häufigsten Anwendungsfälle für updateMany?
Sie wird oft für Batch-Updates verwendet, z. B. für die Anpassung von Preisen, die Änderung von Benutzerstatus oder die Bereinigung veralteter Felder in großen Datensätzen.
Gibt updateMany irgendwelche Ergebnisdaten zurück?
Ja, sie gibt ein Objekt mit Informationen wie matchedCount
und modifiedCount
zurück, das angibt, wie viele Dokumente abgeglichen und aktualisiert wurden.
Was passiert, wenn keine Dokumente dem Filter in updateMany entsprechen?
Wenn keine Dokumente übereinstimmen und upsert
nicht verwendet wird, wird der Vorgang ohne Änderungen abgeschlossen. Es wird kein Fehler ausgelöst.
Ist updateMany in MongoDB atomar?
Nein, es ist nicht atomar über mehrere Dokumente hinweg. Jede Aktualisierung eines Dokuments ist für sich genommen atomar, aber nicht im Ganzen.
Wie kann ich die Leistung von updateMany-Operationen testen?
Verwende die Methoden explain()
oder runCommand({ explain: ... })
, um herauszufinden, ob deine Abfrage einen Index verwendet oder eine Sammelabfrage durchführt.
Kann ich mehrere Aktualisierungsoperatoren in updateMany verketten?
Ja, MongoDB unterstützt die Kombination von Operatoren wie $set
, $inc
, $mul
, etc. in einem einzigen updateMany
Aufruf.
Welche Auswirkungen haben Indizes auf updateMany-Operationen?
Indizes können die Leistung drastisch verbessern, indem sie die Anzahl der gescannten Dokumente während des Filterns reduzieren.
Wie kann ich einen versehentlichen updateMany-Vorgang rückgängig machen?
Du müsstest von einem Backup oder Log wiederherstellen, da MongoDB kein eingebautes Rollback für updateMany hat. Teste immer zuerst im Staging und sichere die Produktionsdaten.

Nic Raboy ist Developer Relations Lead bei MongoDB. Er leitet ein Team von Python-, Java-, C#- und PHP-Entwicklern, die großartige Inhalte erstellen, um Entwicklern zu helfen, MongoDB erfolgreich in ihre Projekte einzubinden. Er hat Erfahrung mit Golang und JavaScript und schreibt oft über seine Entwicklungsabenteuer.