MongoDB-Datensätze aktualisieren

MongoDBBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie Dokumente in einer MongoDB-Collection aktualisieren. Sie beginnen damit, ein einzelnes Dokument mit der Methode updateOne() zu ändern. Anschließend lernen Sie, wie Sie mehrere Dokumente gleichzeitig mit der Methode updateMany() ändern. Sie werden auch mit verschiedenen Update-Operatoren wie $set, $inc und $unset arbeiten, um spezifische Änderungen vorzunehmen. Abschließend werden Sie die upsert-Option untersuchen, mit der Sie entweder ein vorhandenes Dokument aktualisieren oder ein neues erstellen können, falls es nicht existiert. Dieses Lab bietet einen praktischen, praxisorientierten Ansatz, um grundlegende Datenmanipulationsfähigkeiten in MongoDB zu beherrschen.

Aktualisieren eines einzelnen Dokuments mit updateOne

In diesem Schritt lernen Sie, wie Sie ein einzelnes Dokument in einer MongoDB-Collection ändern. Wir verwenden die Methode updateOne() zusammen mit dem Operator $set, um den Wert eines Feldes in einem bestimmten Dokument zu ändern.

Öffnen Sie zunächst die MongoDB Shell, um mit Ihrer Datenbank zu interagieren.

mongosh

Wechseln Sie nach der Anmeldung in der Shell zur mylab_database, die für Sie vorbereitet wurde.

use mylab_database

Sehen wir uns die aktuellen Dokumente in der books-Collection an. Die Methode .pretty() formatiert die Ausgabe, um sie lesbarer zu machen.

db.books.find().pretty();

Sie sollten die drei anfänglichen Buchdokumente sehen. Die _id-Werte sind in Ihrer Umgebung eindeutig.

[
  {
    _id: ObjectId("..."),
    title: 'JavaScript Fundamentals',
    author: 'Mike Johnson',
    year: 2022,
    pages: 350
  },
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450
  },
  {
    _id: ObjectId("..."),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99
  }
]

Aktualisieren wir nun das Veröffentlichungsjahr des Buches "JavaScript Fundamentals" auf 2023.

db.books.updateOne(
  { title: "JavaScript Fundamentals" },
  { $set: { year: 2023 } }
);

Lassen Sie uns diesen Befehl aufschlüsseln:

  • updateOne(): Diese Methode findet das erste Dokument, das dem Filter entspricht, und aktualisiert es.
  • { title: "JavaScript Fundamentals" }: Dies ist das Filterdokument. Es weist MongoDB an, ein Dokument zu finden, bei dem das Feld title den Wert "JavaScript Fundamentals" hat.
  • { $set: { year: 2023 } }: Dies ist das Update-Dokument. Der Operator $set ersetzt den Wert des Feldes year durch 2023.

Der Befehl gibt ein Ergebnisobjekt zurück, das den Vorgang bestätigt.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedCount": 0
}

matchedCount: 1 zeigt an, dass ein Dokument unserem Filter entsprach, und modifiedCount: 1 zeigt an, dass ein Dokument erfolgreich aktualisiert wurde.

Um die Änderung zu überprüfen, suchen Sie das Dokument erneut.

db.books.findOne({ title: "JavaScript Fundamentals" });

Die Ausgabe zeigt das aktualisierte Dokument mit dem neuen Jahr.

{
  _id: ObjectId("..."),
  title: 'JavaScript Fundamentals',
  author: 'Mike Johnson',
  year: 2023,
  pages: 350
}

Aktualisieren mehrerer Dokumente mit updateMany

Manchmal müssen Sie mehrere Dokumente gleichzeitig aktualisieren. Hierfür stellt MongoDB die Methode updateMany() bereit. In diesem Schritt fügen wir allen Büchern, die vor einem bestimmten Jahr veröffentlicht wurden, ein neues Feld hinzu.

Fügen wir allen Büchern, die vor 2022 veröffentlicht wurden, ein Feld status mit dem Wert "Classic" hinzu.

db.books.updateMany({ year: { $lt: 2022 } }, { $set: { status: "Classic" } });

Hier ist eine Erklärung des Befehls:

  • updateMany(): Diese Methode aktualisiert alle Dokumente, die dem angegebenen Filter entsprechen.
  • { year: { $lt: 2022 } }: Dieser Filter wählt Dokumente aus, bei denen das year kleiner als 2022 ist. Der Operator $lt steht für "less than" (kleiner als).
  • { $set: { status: "Classic" } }: Dieses Update-Dokument fügt allen übereinstimmenden Dokumenten ein neues Feld status mit dem Wert "Classic" hinzu.

Die Ausgabe zeigt an, wie viele Dokumente gefunden und geändert wurden. In unserem Fall wurden zwei Bücher vor 2022 veröffentlicht.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 2,
  "modifiedCount": 2,
  "upsertedCount": 0
}

Um zu überprüfen, ob beide Dokumente aktualisiert wurden, können Sie nach allen Büchern mit dem Status "Classic" suchen.

db.books.find({ status: "Classic" }).pretty();

Sie sehen die beiden Bücher, die nun das Feld status enthalten.

[
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450,
    status: 'Classic'
  },
  {
    _id: ObjectId("..."),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99,
    status: 'Classic'
  }
]

Weitere Update-Operatoren verwenden: $inc und $unset

MongoDB bietet eine Vielzahl von Operatoren für verschiedene Arten von Updates. In diesem Schritt lernen Sie, wie Sie mit $inc numerische Werte ändern und mit $unset Felder aus einem Dokument entfernen.

Zuerst verwenden wir den Operator $inc, um die Seitenzahl des Buches "Python Deep Dive" um 50 zu erhöhen. Der Operator $inc inkrementiert ein Feld um einen angegebenen Wert.

db.books.updateOne({ title: "Python Deep Dive" }, { $inc: { pages: 50 } });

Um die Änderung zu bestätigen, rufen Sie das Dokument ab.

db.books.findOne({ title: "Python Deep Dive" });

Das Feld pages sollte nun 500 (450 + 50) sein.

{
  _id: ObjectId("..."),
  title: 'Python Deep Dive',
  author: 'Sarah Williams',
  year: 2021,
  pages: 500,
  status: 'Classic'
}

Als Nächstes entfernen wir das Feld price aus dem Dokument "Machine Learning Basics". Der Operator $unset löscht ein bestimmtes Feld. Der Wert, der $unset übergeben wird (in diesem Fall ""), spielt keine Rolle und kann ein beliebiger Wert sein.

db.books.updateOne(
  { title: "Machine Learning Basics" },
  { $unset: { price: "" } }
);

Überprüfen wir, ob das Feld price entfernt wurde.

db.books.findOne({ title: "Machine Learning Basics" });

Die Ausgabe zeigt das Dokument ohne das Feld price.

{
  _id: ObjectId("..."),
  title: 'Machine Learning Basics',
  author: 'John Doe',
  year: 2020,
  status: 'Classic'
}

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:

  1. Der Filter: { title: "Cloud Computing Essentials" }
  2. Das Update: { $set: { ... } }
  3. 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;

Zusammenfassung

In diesem Lab haben Sie die wesentlichen Techniken zum Aktualisieren von Dokumenten in MongoDB kennengelernt. Sie haben das Ändern einzelner Dokumente mit updateOne und mehrerer Dokumente mit updateMany geübt. Sie haben auch leistungsstarke Update-Operatoren erkundet, darunter $set zum Ändern von Feldwerten, $inc zum Inkrementieren von Zahlen und $unset zum Entfernen von Feldern. Schließlich haben Sie gelernt, wie Sie die Option upsert verwenden, um ein Dokument zu erstellen, falls es noch nicht existiert. Diese Fähigkeiten sind grundlegend für die Verwaltung und Pflege von Daten in jeder MongoDB-Anwendung.