Dokumente mit upsert erstellen
Ein „Upsert“ ist eine spezielle Art von Aktualisierungsoperation, die entweder ein Dokument aktualisiert, falls es existiert, oder ein neues einfügt, falls es nicht existiert. Dies ist nützlich, um eine separate „Prüfen-dann-Einfügen“-Logik zu vermeiden und die Atomarität bei Datenbankoperationen zu gewährleisten. Upserts sind besonders wertvoll in Szenarien, in denen Sie Folgendes erreichen möchten:
- Datenkonsistenz sicherstellen: Anstatt zuerst zu prüfen, ob ein Dokument existiert, und dann zu entscheiden, ob eingefügt oder aktualisiert werden soll, können Sie eine einzige Operation durchführen, die beide Fälle atomar behandelt.
- Gleichzeitige Operationen behandeln: In Umgebungen mit mehreren Benutzern verhindert ein Upsert Race Conditions, bei denen ein anderer Prozess dasselbe Dokument zwischen Ihrer Prüf- und Einfügeoperation einfügen könnte.
- Anwendungslogik vereinfachen: Reduziert die Notwendigkeit komplexer bedingter Logik in Ihrem Anwendungscode, was diesen wartbarer und weniger fehleranfällig macht.
Sie können dieses Verhalten aktivieren, indem Sie die Option upsert: true zu Ihrem Update-Befehl hinzufügen.
Versuchen wir, ein neues Buch hinzuzufügen: „Cloud Computing Essentials“. Da dieses Buch nicht in unserer Sammlung existiert, wird die Upsert-Operation es erstellen.
db.books.updateOne(
{ title: "Cloud Computing Essentials" },
{ $set: { author: "David Lee", year: 2023, pages: 300 } },
{ upsert: true }
);
Der Befehl besteht aus drei Teilen:
- Der Filter:
{ title: "Cloud Computing Essentials" }
- Das Update:
{ $set: { ... } }
- Die Optionen:
{ upsert: true }
Da kein Dokument mit dem Filter übereinstimmte, wurde ein neues erstellt. Das Ergebnisobjekt spiegelt dies wider, indem es eine upsertedId enthält.
{
acknowledged: true,
matchedCount: 0,
modifiedCount: 0,
upsertedCount: 1,
upsertedId: ObjectId("...")
}
Führen wir nun denselben Befehl erneut aus. Dieses Mal findet MongoDB das Dokument, das wir gerade erstellt haben, und aktualisiert es.
db.books.updateOne(
{ title: "Cloud Computing Essentials" },
{ $set: { author: "David Lee", year: 2023, pages: 300 } },
{ upsert: true }
);
Das Ergebnis zeigt nun matchedCount: 1. Da die Daten, die wir setzen, mit den vorhandenen Daten übereinstimmen, ist modifiedCount gleich 0. Hätten wir einen Wert geändert, wäre modifiedCount gleich 1.
{
"acknowledged": true,
"insertedId": null,
"matchedCount": 1,
"modifiedCount": 0,
"upsertedCount": 0
}
Sie können überprüfen, ob das neue Buch in der Sammlung existiert.
db.books.findOne({ title: "Cloud Computing Essentials" });
Die Ausgabe zeigt das neu erstellte Dokument an.
{
_id: ObjectId("..."),
title: 'Cloud Computing Essentials',
author: 'David Lee',
year: 2023,
pages: 300
}
Wenn Sie fertig sind, können Sie die MongoDB Shell beenden.
exit;