MongoDB-Dokumente verknüpfen

MongoDBBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie die Grundlagen des Aufbaus von Beziehungen zwischen Dokumenten in MongoDB. Diese Technik, bekannt als Referenzierung (referencing), ist unerlässlich für den Aufbau komplexer und organisierter Datenbankstrukturen. Sie üben das Erstellen von Collections, das Einfügen von Dokumenten mit Referenzen auf andere Dokumente, das Abrufen und Kombinieren zusammengehöriger Daten mithilfe der $lookup-Aggregationsstufe und die Verwaltung des Lebenszyklus dieser verknüpften Dokumente. Am Ende dieses Labs werden Sie ein solides Verständnis dafür haben, wie Sie One-to-Many-Beziehungen in Ihrer MongoDB-Datenbank modellieren und verwalten.

Einrichten von Dokumentbeziehungen

In diesem ersten Schritt erstellen Sie zwei separate Collections und bauen eine Beziehung zwischen ihnen auf. Wir modellieren ein gängiges Szenario: eine Bibliotheksdatenbank mit authors (Autoren) und books (Büchern). Jedes Buch wird auf seinen Autor verweisen.

Öffnen Sie zunächst die MongoDB Shell. Diese interaktive Befehlszeilenschnittstelle (command-line interface) ermöglicht Ihnen die Interaktion mit Ihrer MongoDB-Instanz.

mongosh

Sobald Sie sich in der Shell befinden, sehen Sie eine test> Eingabeaufforderung. Wechseln wir zu einer neuen Datenbank namens library_database. Wenn die Datenbank nicht existiert, erstellt MongoDB sie für Sie, sobald Sie die ersten Daten speichern.

use library_database

Lassen Sie uns nun die Collection authors erstellen, indem wir zwei Dokumente einfügen. Jedes Dokument hat eine eindeutige _id vom Typ ObjectId, die wir für die Referenzierung verwenden werden.

db.authors.insertMany([
  {
    _id: ObjectId("660a1f5c9b8f8b1234567890"),
    name: "Jane Austen",
    nationality: "British"
  },
  {
    _id: ObjectId("660a1f5c9b8f8b1234567891"),
    name: "George Orwell",
    nationality: "British"
  }
]);

Sie sollten eine Bestätigung sehen, dass die Dokumente erfolgreich eingefügt wurden.

Beispielausgabe:

{
  "acknowledged": true,
  "insertedIds": {
    "0": ObjectId("660a1f5c9b8f8b1234567890"),
    "1": ObjectId("660a1f5c9b8f8b1234567891")
  }
}

Als Nächstes erstellen Sie die Collection books. In jedem Buchdokument speichert das Feld author_id die ObjectId des entsprechenden Autors aus der Collection authors. Dies schafft die Verknüpfung zwischen einem Buch und seinem Autor.

db.books.insertMany([
  {
    title: "Pride and Prejudice",
    author_id: ObjectId("660a1f5c9b8f8b1234567890"),
    year: 1813
  },
  {
    title: "1984",
    author_id: ObjectId("660a1f5c9b8f8b1234567891"),
    year: 1949
  }
]);

Beispielausgabe:

{
  "acknowledged": true,
  "insertedIds": {
    "0": ObjectId("660b2a1c9b8f8b1234567892"),
    "1": ObjectId("660b2a1c9b8f8b1234567893")
  }
}

Sie haben nun erfolgreich zwei Collections erstellt und Dokumente in der Collection books mit Dokumenten in der Collection authors verknüpft. Lassen Sie die MongoDB-Shell für den nächsten Schritt geöffnet.

Abfragen verknüpfter Dokumente

Nachdem Sie nun Beziehungen hergestellt haben, ist der nächste logische Schritt, die verknüpften Daten in einer einzigen Abfrage abzurufen. Das Aggregations-Framework (aggregation framework) von MongoDB stellt hierfür die $lookup-Stufe bereit, die einen Left Outer Join mit einer anderen Collection durchführt.

Stellen Sie sicher, dass Sie sich immer noch in der mongosh-Shell befinden und die library_database verwenden.

Führen wir eine Abfrage durch, um alle Bücher abzurufen und die entsprechenden Autoreninformationen in die Ergebnisse einzubetten.

db.books.aggregate([
  {
    $lookup: {
      from: "authors",
      localField: "author_id",
      foreignField: "_id",
      as: "author_details"
    }
  }
]);

Die $lookup-Stufe verknüpft die books-Collection mit der authors-Collection. Lassen Sie uns die Parameter überprüfen:

  • from: "authors": Gibt die Collection an, mit der verknüpft werden soll.
  • localField: "author_id": Gibt das Feld aus den Eingabedokumenten (aus der books-Collection) an.
  • foreignField: "_id": Gibt das Feld aus den Dokumenten in der "from"-Collection (der authors-Collection) an.
  • as: "author_details": Gibt den Namen des neuen Array-Feldes an, das den Ausgaben hinzugefügt werden soll. Dieses Array enthält die übereinstimmenden Autordokumente.

Beispielausgabe für eines der Dokumente:

[
  {
    "_id": ObjectId("..."),
    "title": "Pride and Prejudice",
    "author_id": ObjectId("660a1f5c9b8f8b1234567890"),
    "year": 1813,
    "author_details": [
      {
        "_id": ObjectId("660a1f5c9b8f8b1234567890"),
        "name": "Jane Austen",
        "nationality": "British"
      }
    ]
  },
  ...
]

Wie Sie sehen können, ist das Feld author_details ein Array, das das vollständige Dokument des Autors enthält. Diese leistungsstarke Funktion ermöglicht es Ihnen, umfassende Daten abzurufen, ohne mehrere Abfragen von Ihrer Anwendung aus durchführen zu müssen.

Aktualisieren verwandter Dokumente

Daten in einer Datenbank sind selten statisch. In diesem Schritt lernen Sie, wie Sie Dokumente sowohl in der authors- als auch in der books-Collection aktualisieren. Da wir Referenzen verwenden, können Sie die Informationen eines Autors an einer Stelle aktualisieren, und alle Abfragen, die mit diesem Autor verknüpft sind, spiegeln die Änderung automatisch wider.

Fügen wir dem Dokument von Jane Austen ein Geburtsjahr hinzu. Wir verwenden die Methode updateOne mit dem Operator $set, um ein neues Feld hinzuzufügen, ohne das gesamte Dokument zu überschreiben.

db.authors.updateOne(
  { name: "Jane Austen" },
  {
    $set: {
      birth_year: 1775
    }
  }
);

Beispielausgabe:

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

Aktualisieren wir nun die Details eines Buches. Wir fügen "Pride and Prejudice" ein genre hinzu.

db.books.updateOne(
  { title: "Pride and Prejudice" },
  {
    $set: {
      genre: "Romance"
    }
  }
);

Um zu überprüfen, ob beide Aktualisierungen erfolgreich waren, können Sie die Dokumente direkt abfragen.

Überprüfen Sie zuerst den Autor:

db.authors.findOne({ name: "Jane Austen" });

Überprüfen Sie dann das Buch:

db.books.findOne({ title: "Pride and Prejudice" });

Sie sehen die neuen Felder birth_year und genre in den jeweiligen Dokumenten. Die Referenz author_id im Buchdokument bleibt unverändert und erhält die Verknüpfung.

Der letzte Teil der Verwaltung von Beziehungen ist der Umgang mit Löschungen. Wenn Sie ein Dokument entfernen, müssen Sie berücksichtigen, was mit den Dokumenten geschieht, die darauf verweisen. MongoDB erzwingt die referentielle Integrität nicht automatisch, daher ist dies eine Aufgabe, die Sie auf Anwendungsebene verwalten müssen.

Löschen wir zunächst ein Buch und behalten seinen Autor. Wir werden das Buch "1984" entfernen.

db.books.deleteOne({ title: "1984" });

Beispielausgabe:

{ "acknowledged": true, "deletedCount": 1 }

Wenn Sie nun die books-Collection abfragen, werden Sie feststellen, dass nur noch ein Buch übrig ist. Das Dokument "George Orwell" in der authors-Collection bleibt unberührt.

Betrachten wir nun ein komplexeres Szenario: das Entfernen eines Autors und all seiner zugehörigen Bücher. Dies erfordert einen mehrstufigen Prozess zur Aufrechterhaltung der Datenintegrität.

Finden Sie zuerst die ID des Autors und speichern Sie sie in einer Variablen. Wir werden "Jane Austen" entfernen.

const authorId = db.authors.findOne({ name: "Jane Austen" })._id;

Verwenden Sie als Nächstes diese ID, um alle Bücher zu löschen, die mit diesem Autor verknüpft sind. Der Befehl deleteMany wird verwendet, falls ein Autor mehrere Bücher hat.

db.books.deleteMany({ author_id: authorId });

Entfernen Sie schließlich das Autoren-Dokument selbst.

db.authors.deleteOne({ _id: authorId });

Dieser manuelle, mehrstufige Prozess stellt sicher, dass Sie keine "verwaisten" Buchdokumente mit ungültigen author_id-Referenzen hinterlassen. Sie können überprüfen, ob sowohl das Buch "Pride and Prejudice" als auch der Autor "Jane Austen" aus ihren jeweiligen Collections entfernt wurden.

Nun können Sie die MongoDB-Shell beenden.

exit

Zusammenfassung

In diesem Lab haben Sie die wesentlichen Techniken für die Arbeit mit verknüpften Dokumenten in MongoDB kennengelernt. Sie haben mit der Erstellung von authors- und books-Collections begonnen und eine Eins-zu-Viele-Beziehung mithilfe von Dokumentreferenzen hergestellt. Anschließend haben Sie geübt, wie Daten aus diesen verknüpften Collections mithilfe der Aggregationsstufe $lookup abgerufen und kombiniert werden. Darüber hinaus haben Sie gelernt, einzelne Dokumente zu aktualisieren, ohne ihre Verknüpfungen zu unterbrechen, und schließlich, wie Löschungen ordnungsgemäß verwaltet werden, um die Datenintegrität zu wahren, indem verwandte Dokumente in einem kontrollierten, mehrstufigen Prozess entfernt werden. Diese Fähigkeiten bilden eine solide Grundlage für das Design und die Entwicklung anspruchsvollerer und vernetzter NoSQL-Datenbankanwendungen.