Vincular documentos de MongoDB

MongoDBMongoDBBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá a establecer relaciones entre documentos de MongoDB, incluyendo la creación de referencias de documentos, la actualización de datos relacionados, la consulta de documentos vinculados, la eliminación de enlaces de documentos y la garantía de la integridad de los datos. El laboratorio cubre técnicas fundamentales para trabajar con relaciones en MongoDB, como el uso de la etapa de agregación $lookup para unir colecciones y actualizar documentos en colecciones relacionadas. Al final del laboratorio, tendrá una comprensión sólida de cómo administrar relaciones en su base de datos MongoDB.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb(("MongoDB")) -.-> mongodb/RelationshipsGroup(["Relationships"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb/BasicOperationsGroup -.-> mongodb/insert_document("Insert Document") mongodb/BasicOperationsGroup -.-> mongodb/update_document("Update Document") mongodb/BasicOperationsGroup -.-> mongodb/delete_document("Delete Document") mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/QueryOperationsGroup -.-> mongodb/project_fields("Project Fields") mongodb/AggregationOperationsGroup -.-> mongodb/aggregate_group_totals("Aggregate Group Totals") mongodb/RelationshipsGroup -.-> mongodb/create_document_references("Create Document References") mongodb/RelationshipsGroup -.-> mongodb/link_related_documents("Link Related Documents") subgraph Lab Skills mongodb/insert_document -.-> lab-422087{{"Vincular documentos de MongoDB"}} mongodb/update_document -.-> lab-422087{{"Vincular documentos de MongoDB"}} mongodb/delete_document -.-> lab-422087{{"Vincular documentos de MongoDB"}} mongodb/find_documents -.-> lab-422087{{"Vincular documentos de MongoDB"}} mongodb/query_with_conditions -.-> lab-422087{{"Vincular documentos de MongoDB"}} mongodb/project_fields -.-> lab-422087{{"Vincular documentos de MongoDB"}} mongodb/aggregate_group_totals -.-> lab-422087{{"Vincular documentos de MongoDB"}} mongodb/create_document_references -.-> lab-422087{{"Vincular documentos de MongoDB"}} mongodb/link_related_documents -.-> lab-422087{{"Vincular documentos de MongoDB"}} end

Crear referencias de documentos

En este paso, aprenderá a crear referencias de documentos en MongoDB, que es una técnica fundamental para establecer relaciones entre diferentes colecciones.

Primero, iniciemos la shell de MongoDB:

mongosh

Crearemos dos colecciones para demostrar la referencia de documentos: authors y books. Este es un escenario común en el que los libros están vinculados a sus autores.

Cree la colección de autores:

use library_database

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

Salida de ejemplo:

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

Ahora, creemos la colección de libros con referencias a los autores:

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

Salida de ejemplo:

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

Verifiquemos las referencias consultando los libros con los detalles de sus autores:

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

Esto demuestra cómo crear referencias de documentos en MongoDB. Hemos vinculado los libros a sus autores utilizando el campo author_id, que contiene el ObjectId del autor correspondiente.

Actualizar datos relacionados

En este paso, aprenderá a actualizar documentos relacionados en MongoDB, basado en las referencias de documentos que creamos en el paso anterior.

Primero, asegúrese de estar conectado a la shell de MongoDB y de utilizar la base de datos library_database:

mongosh
use library_database

Actualicemos la información de un autor. Modificaremos los detalles de Jane Austen:

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

Salida de ejemplo:

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

Ahora, actualicemos los detalles de un libro manteniendo su referencia:

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

Salida de ejemplo:

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

Verifiquemos las actualizaciones consultando los detalles completos:

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

Esto demuestra cómo actualizar documentos relacionados manteniendo sus referencias. El operador $set le permite agregar o modificar campos específicos sin reemplazar todo el documento.

Consultar documentos vinculados

En este paso, aprenderá técnicas avanzadas para consultar documentos vinculados en MongoDB utilizando la etapa de tubería de agregación $lookup.

Primero, asegúrese de estar conectado a la shell de MongoDB:

mongosh
use library_database

Realicemos una búsqueda simple para unir los libros con sus autores:

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

Ahora, creemos una consulta más compleja para filtrar los libros por nacionalidad del autor:

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

Cree otra consulta para encontrar los libros publicados después de 1900:

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

Estas consultas demuestran diferentes maneras de consultar y combinar documentos vinculados utilizando el marco de agregación de MongoDB.

Eliminar enlaces de documentos

En este paso, aprenderá a eliminar enlaces de documentos y a administrar documentos relacionados en MongoDB.

Primero, asegúrese de estar conectado a la shell de MongoDB:

mongosh
use library_database

Comencemos eliminando un libro específico mientras mantenemos al autor:

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

Salida de ejemplo:

{ acknowledged: true, deletedCount: 1 }

Ahora, eliminemos un autor y todos sus libros asociados utilizando un proceso en varios pasos:

// Primero, encuentre el ID del autor
const authorToRemove = db.authors.findOne({ name: "George Orwell" })

// Elimine todos los libros de este autor
db.books.deleteMany({ author_id: authorToRemove._id })

// Luego, elimine al autor
db.authors.deleteOne({ _id: authorToRemove._id })

Demostremos un enfoque de eliminación suave agregando un campo de estado:

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

Para consultar solo los libros activos:

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

Estos métodos muestran diferentes estrategias para administrar enlaces de documentos y eliminar documentos relacionados.

Comprobar la integridad de los datos

En este paso, aprenderá técnicas para garantizar la integridad de los datos en las relaciones de documentos de MongoDB.

Primero, asegúrese de estar conectado a la shell de MongoDB:

mongosh
use library_database

Cree una regla de validación para la colección de autores:

db.createCollection("authors", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["name", "nationality"],
         properties: {
            name: {
               bsonType: "string",
               description: "debe ser una cadena y es obligatoria"
            },
            nationality: {
               bsonType: "string",
               description: "debe ser una cadena y es obligatoria"
            },
            birth_year: {
               bsonType: "int",
               minimum: 1500,
               maximum: 2023,
               description: "debe ser un entero entre 1500 y 2023"
            }
         }
      }
   }
})

Cree una función para comprobar referencias huérfanas:

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("Libros huérfanos:", orphanedBooks.length)
    return orphanedBooks
}

checkOrphanedReferences()

Cree una comprobación de integridad de datos para los documentos de libros:

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

    print("Libros no válidos:", invalidBooks.length)
    return invalidBooks
}

validateBookDocuments()

Demuestre una comprobación de integridad referencial:

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("Referencias de autores faltantes:", missingAuthors.length)
    return missingAuthors
}

checkReferentialIntegrity()

Resumen

En este laboratorio, aprendió cómo crear referencias de documentos en MongoDB, que es una técnica fundamental para establecer relaciones entre diferentes colecciones. Creó dos colecciones, "authors" y "books", y vinculó los libros a sus autores utilizando el campo "author_id". También aprendió cómo consultar los documentos vinculados utilizando la etapa de agregación $lookup. Además, exploró cómo actualizar documentos relacionados, consultar documentos vinculados, eliminar enlaces de documentos y garantizar la integridad de los datos al trabajar con referencias de documentos en MongoDB.