MongoDB-Dokumente verknüpfen

MongoDBMongoDBBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Labyrinth lernen Sie, wie Sie Beziehungen zwischen MongoDB-Dokumenten herstellen, einschließlich des Erstellens von Dokumentverweisen, des Aktualisierens von verknüpften Daten, des Abfragens von verknüpften Dokumenten, des Entfernens von Dokumentverweisen und der Sicherstellung der Datengüte. Das Labyrinth behandelt grundlegende Techniken für die Arbeit mit MongoDB-Beziehungen, wie das Verwenden der $lookup-Aggregationsphase zum Verbinden von Sammlungen und das Aktualisieren von Dokumenten in verwandten Sammlungen. Am Ende des Labyrinths werden Sie eine solide Vorstellung davon haben, wie Sie Beziehungen in Ihrer MongoDB-Datenbank verwalten.

Dokumentverweise erstellen

In diesem Schritt lernen Sie, wie Sie in MongoDB Dokumentverweise erstellen, was eine grundlegende Technik zur Herstellung von Beziehungen zwischen verschiedenen Sammlungen ist.

Beginnen wir zunächst mit dem Start der MongoDB-Shell:

mongosh

Wir werden zwei Sammlungen erstellen, um die Dokumentreferenzierung zu demonstrieren: authors und books. Dies ist ein häufiger Fall, in dem Bücher mit ihren Autoren verknüpft sind.

Erstellen Sie die Autoren-Sammlung:

use library_database

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

Beispielausgabe:

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

Erstellen wir nun die Bücher-Sammlung mit Verweisen auf Autoren:

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")
  }
}

Verifizieren wir die Verweise, indem wir Bücher mit ihren Autoren-Details abfragen:

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

Dies zeigt, wie Sie in MongoDB Dokumentverweise erstellen. Wir haben Bücher mit ihren Autoren über das author_id-Feld verknüpft, das die ObjectId des entsprechenden Autors enthält.

Verwandte Daten aktualisieren

In diesem Schritt lernen Sie, wie Sie in MongoDB verwandte Dokumente aktualisieren, ausgehend von den Dokumentverweisen, die wir im vorherigen Schritt erstellt haben.

Stellen Sie zunächst sicher, dass Sie mit der MongoDB-Shell verbunden sind und die library_database verwenden:

mongosh
use library_database

Lassen Sie uns die Informationen eines Autors aktualisieren. Wir werden die Details von Jane Austen ändern:

db.authors.updateOne(
    { _id: ObjectId("660a1f5c9b8f8b1234567890") },
    {
        $set: {
            birth_year: 1775,
            notable_works: ["Pride and Prejudice", "Sense and Sensibility"]
        }
    }
)

Beispielausgabe:

{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1
}

Lassen Sie uns nun die Details eines Buches aktualisieren, während wir seine Referenz beibehalten:

db.books.updateOne(
    { title: "Pride and Prejudice" },
    {
        $set: {
            genre: "Romance",
            pages: 432,
            rating: 4.5
        }
    }
)

Beispielausgabe:

{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1
}

Verifizieren wir die Updates, indem wir die vollständigen Details abfragen:

db.authors.findOne({ name: "Jane Austen" })
db.books.findOne({ title: "Pride and Prejudice" })

Dies zeigt, wie Sie verwandte Dokumente aktualisieren, während Sie ihre Referenzen beibehalten. Der $set-Operator ermöglicht es Ihnen, spezifische Felder hinzuzufügen oder zu modifizieren, ohne das gesamte Dokument zu ersetzen.

Verknüpfte Dokumente abfragen

In diesem Schritt lernen Sie fortgeschrittene Techniken zum Abfragen von verknüpften Dokumenten in MongoDB mithilfe der $lookup-Aggregationspipelinestufe.

Stellen Sie zunächst sicher, dass Sie mit der MongoDB-Shell verbunden sind:

mongosh
use library_database

Lassen Sie uns eine einfache Abfrage durchführen, um Bücher mit ihren Autoren zu verbinden:

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

Lassen Sie uns nun eine komplexere Abfrage erstellen, um Bücher nach der Nationalität des Autors zu filtern:

db.books.aggregate([
    {
        $lookup: {
            from: "authors",
            localField: "author_id",
            foreignField: "_id",
            as: "author_details"
        }
    },
    {
        $match: {
            "author_details.nationality": "British"
        }
    },
    {
        $project: {
            title: 1,
            year: 1,
            "author_name": { $arrayElemAt: ["$author_details.name", 0] }
        }
    }
])

Lassen Sie uns eine weitere Abfrage erstellen, um Bücher zu finden, die nach 1900 veröffentlicht wurden:

db.books.aggregate([
    {
        $lookup: {
            from: "authors",
            localField: "author_id",
            foreignField: "_id",
            as: "author_details"
        }
    },
    {
        $match: {
            year: { $gt: 1900 }
        }
    },
    {
        $project: {
            title: 1,
            year: 1,
            "author_name": { $arrayElemAt: ["$author_details.name", 0] }
        }
    }
])

Diese Abfragen demonstrieren verschiedene Möglichkeiten, verknüpfte Dokumente mithilfe des MongoDB-Aggregationsframeworks abzufragen und zu kombinieren.

Dokumentverweise entfernen

In diesem Schritt lernen Sie, wie Sie in MongoDB Dokumentverweise entfernen und verwandte Dokumente verwalten.

Stellen Sie zunächst sicher, dass Sie mit der MongoDB-Shell verbunden sind:

mongosh
use library_database

Lassen Sie uns beginnen, ein bestimmtes Buch zu entfernen, während den Autor beibehalten wird:

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

Beispielausgabe:

{ acknowledged: true, deletedCount: 1 }

Lassen Sie uns nun einen Autor und alle zugehörigen Bücher in einem mehrstufigen Prozess entfernen:

// Zunächst finden Sie die ID des Autors
const authorToRemove = db.authors.findOne({ name: "George Orwell" })

// Löschen Sie alle Bücher dieses Autors
db.books.deleteMany({ author_id: authorToRemove._id })

// Entfernen Sie dann den Autor
db.authors.deleteOne({ _id: authorToRemove._id })

Lassen Sie uns einen Soft-Delete-Ansatz demonstrieren, indem wir ein Statusfeld hinzufügen:

db.books.updateOne(
    { title: "Pride and Prejudice" },
    {
        $set: {
            status: "archived",
            archived_date: new Date()
        }
    }
)

Um nur aktive Bücher abzufragen:

db.books.find({
    $or: [
        { status: { $exists: false } },
        { status: { $ne: "archived" } }
    ]
})

Diese Methoden zeigen verschiedene Strategien zur Verwaltung von Dokumentverweisen und zum Entfernen verwandter Dokumente.

Überprüfen der Datenintegrität

In diesem Schritt lernen Sie Techniken, um die Datenintegrität in MongoDB-Dokumentbeziehungen sicherzustellen.

Stellen Sie zunächst sicher, dass Sie mit der MongoDB-Shell verbunden sind:

mongosh
use library_database

Erstellen Sie eine Validierungsregel für die authors-Sammlung:

db.createCollection("authors", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["name", "nationality"],
         properties: {
            name: {
               bsonType: "string",
               description: "muss ein String sein und ist erforderlich"
            },
            nationality: {
               bsonType: "string",
               description: "muss ein String sein und ist erforderlich"
            },
            birth_year: {
               bsonType: "int",
               minimum: 1500,
               maximum: 2023,
               description: "muss ein Integer zwischen 1500 und 2023 sein"
            }
         }
      }
   }
})

Lassen Sie uns eine Funktion erstellen, um orphene Verweise zu überprüfen:

function checkOrphanedReferences() {
    const orphanedBooks = db.books.aggregate([
        {
            $lookup: {
                from: "authors",
                localField: "author_id",
                foreignField: "_id",
                as: "author_exists"
            }
        },
        {
            $match: {
                author_exists: { $size: 0 }
            }
        }
    ]).toArray()

    print("Orphene Bücher:", orphanedBooks.length)
    return orphanedBooks
}

checkOrphanedReferences()

Erstellen Sie eine Datenintegritätsüberprüfung für Buchdokumente:

function validateBookDocuments() {
    const invalidBooks = db.books.find({
        $or: [
            { title: { $not: { $type: "string" } } },
            { year: { $not: { $type: "int" } } },
            { year: { $lt: 0 } }
        ]
    }).toArray()

    print("Ungültige Bücher:", invalidBooks.length)
    return invalidBooks
}

validateBookDocuments()

Demonstrieren Sie eine Prüfung auf referentielle Integrität:

function checkReferentialIntegrity() {
    const authorIds = db.authors.distinct("_id")
    const bookAuthorIds = db.books.distinct("author_id")

    const missingAuthors = bookAuthorIds.filter(
        id =>!authorIds.some(authorId => authorId.equals(id))
    )

    print("Fehlende Autorverweise:", missingAuthors.length)
    return missingAuthors
}

checkReferentialIntegrity()

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie in MongoDB Dokumentverweise erstellen, was eine grundlegende Technik zur Herstellung von Beziehungen zwischen verschiedenen Sammlungen ist. Sie haben zwei Sammlungen, "authors" und "books", erstellt und Bücher mit ihren Autoren über das Feld "author_id" verknüpft. Sie haben auch gelernt, wie Sie die verknüpften Dokumente mithilfe der $lookup-Aggregationsstufe abfragen. Darüber hinaus haben Sie untersucht, wie Sie verwandte Dokumente aktualisieren, verknüpfte Dokumente abfragen, Dokumentverweise entfernen und die Datenintegrität gewährleisten, wenn Sie mit Dokumentverweisen in MongoDB arbeiten.