Usar referencias 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 usar referencias de MongoDB para diseñar relaciones de datos y administrar las relaciones entre documentos padre e hijo. Comenzará creando un sistema simple de gestión de bibliotecas con libros y autores, luego explorará técnicas para vincular documentos padre e hijo, actualizar referencias de hijos, consultar relaciones padre-hijo y mantener la integridad referencial. El laboratorio cubre los principios clave de las referencias de documentos en MongoDB y proporciona ejemplos prácticos para ayudarlo a comprender y aplicar estos conceptos de manera efectiva.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb(("MongoDB")) -.-> mongodb/RelationshipsGroup(["Relationships"]) mongodb(("MongoDB")) -.-> mongodb/IndexingGroup(["Indexing"]) mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb/BasicOperationsGroup -.-> mongodb/start_mongodb_shell("Start MongoDB Shell") mongodb/BasicOperationsGroup -.-> mongodb/update_document("Update Document") mongodb/BasicOperationsGroup -.-> mongodb/bulk_update_documents("Bulk Update Documents") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/query_embedded_documents("Query Embedded Documents") mongodb/IndexingGroup -.-> mongodb/create_index("Create Index") 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/start_mongodb_shell -.-> lab-422099{{"Usar referencias de MongoDB"}} mongodb/update_document -.-> lab-422099{{"Usar referencias de MongoDB"}} mongodb/bulk_update_documents -.-> lab-422099{{"Usar referencias de MongoDB"}} mongodb/query_with_conditions -.-> lab-422099{{"Usar referencias de MongoDB"}} mongodb/query_embedded_documents -.-> lab-422099{{"Usar referencias de MongoDB"}} mongodb/create_index -.-> lab-422099{{"Usar referencias de MongoDB"}} mongodb/aggregate_group_totals -.-> lab-422099{{"Usar referencias de MongoDB"}} mongodb/create_document_references -.-> lab-422099{{"Usar referencias de MongoDB"}} mongodb/link_related_documents -.-> lab-422099{{"Usar referencias de MongoDB"}} end

Diseñar relaciones de datos

En este paso, exploraremos cómo diseñar relaciones de datos en MongoDB creando un ejemplo práctico de documentos vinculados. Modelaremos un sistema simple de gestión de bibliotecas con libros y autores.

Comprender las referencias de documentos en MongoDB

MongoDB ofrece dos maneras principales de crear relaciones entre documentos:

  1. Documentos incrustados
  2. Referencias de documentos

Para nuestro sistema de bibliotecas, usaremos referencias de documentos para demostrar cómo vincular datos relacionados entre colecciones.

Primero, iniciemos la shell de MongoDB:

mongosh

Ahora, creemos nuestra base de datos y colecciones:

use library_database

db.authors.insertOne({
    _id: ObjectId("author1"),
    name: "Jane Austen",
    nationality: "British",
    birthYear: 1775
})

db.books.insertOne({
    title: "Pride and Prejudice",
    author_id: ObjectId("author1"),
    published: 1813,
    genre: "Classic Literature"
})

Analizar la referencia

Veamos lo que hemos hecho:

  • Creamos una colección authors con un _id único
  • Creamos una colección books que hace referencia al autor usando author_id
  • El campo author_id contiene el _id del documento del autor correspondiente

Para verificar nuestras referencias, podemos consultar los documentos:

db.authors.findOne({ name: "Jane Austen" })
db.books.findOne({ title: "Pride and Prejudice" })
Salida de ejemplo
{
  _id: ObjectId("author1"),
  name: 'Jane Austen',
  nationality: 'British',
  birthYear: 1775
}

{
  _id: ObjectId(...),
  title: 'Pride and Prejudice',
  author_id: ObjectId("author1"),
  published: 1813,
  genre: 'Classic Literature'
}

Principios clave de las referencias de documentos

  • Utilice _id para crear enlaces entre documentos
  • Mantenga las referencias simples y consistentes
  • Elija referencias cuando los datos son grandes o cambian con frecuencia
  • Normalice los datos para reducir la duplicación

Vincular documentos padre e hijo

En este paso, expandiremos nuestra base de datos de biblioteca creando relaciones más complejas entre documentos padre e hijo. Demonstraremos cómo vincular varios libros a un autor y administrar efectivamente estas relaciones.

Agregar varios libros para un autor

Continuemos con nuestra base de datos existente y agregemos más libros de Jane Austen:

db.books.insertMany([
    {
        title: "Sense and Sensibility",
        author_id: ObjectId("author1"),
        published: 1811,
        genre: "Classic Literature"
    },
    {
        title: "Emma",
        author_id: ObjectId("author1"),
        published: 1815,
        genre: "Classic Literature"
    }
])

Consultar documentos relacionados

Para encontrar todos los libros de Jane Austen, usaremos el author_id:

db.books.find({ author_id: ObjectId("author1") })
Salida de ejemplo
[
  {
    _id: ObjectId(...),
    title: 'Pride and Prejudice',
    author_id: ObjectId("author1"),
    published: 1813,
    genre: 'Classic Literature'
  },
  {
    _id: ObjectId(...),
    title: 'Sense and Sensibility',
    author_id: ObjectId("author1"),
    published: 1811,
    genre: 'Classic Literature'
  },
  {
    _id: ObjectId(...),
    title: 'Emma',
    author_id: ObjectId("author1"),
    published: 1815,
    genre: 'Classic Literature'
  }
]

Contar libros de un autor

También podemos contar el número de libros de un autor específico:

db.books.countDocuments({ author_id: ObjectId("author1") })
Salida de ejemplo
3

Consulta avanzada con agregación

Usemos el marco de agregación para obtener información más detallada:

db.books.aggregate([
    { $match: { author_id: ObjectId("author1") } },
    { $group: {
        _id: "$author_id",
        totalBooks: { $sum: 1 },
        earliestPublished: { $min: "$published" },
        latestPublished: { $max: "$published" }
    }}
])
Salida de ejemplo
[
  {
    _id: ObjectId("author1"),
    totalBooks: 3,
    earliestPublished: 1811,
    latestPublished: 1815
  }
]

Actualizar referencias de hijos

En este paso, aprenderemos cómo actualizar referencias entre documentos padre e hijo en MongoDB. Exploraremos diferentes técnicas para modificar referencias de documentos y mantener la integridad de los datos.

Agregar un nuevo autor y actualizar referencias de libros

Primero, agreguemos otro autor a nuestra base de datos:

db.authors.insertOne({
    _id: ObjectId("author2"),
    name: "Charles Dickens",
    nationality: "British",
    birthYear: 1812
})

Actualizar la referencia del autor de un solo libro

Actualicemos un libro para cambiar su referencia de autor:

db.books.updateOne(
    { title: "Emma" },
    { $set: { author_id: ObjectId("author2") } }
)

Verificar la actualización

Verifique la referencia del autor del libro actualizado:

db.books.findOne({ title: "Emma" })
Salida de ejemplo
{
  _id: ObjectId(...),
  title: 'Emma',
  author_id: ObjectId("author2"),
  published: 1815,
  genre: 'Classic Literature'
}

Actualización masiva de referencias

También podemos actualizar múltiples documentos a la vez:

db.books.updateMany(
    { author_id: ObjectId("author1") },
    { $set: { genre: "Romantic Novel" } }
)

Verificar actualizaciones de múltiples documentos

Verifique la actualización del género:

db.books.find({ author_id: ObjectId("author1") })
Salida de ejemplo
[
  {
    _id: ObjectId(...),
    title: 'Pride and Prejudice',
    author_id: ObjectId("author1"),
    published: 1813,
    genre: 'Romantic Novel'
  },
  {
    _id: ObjectId(...),
    title: 'Sense and Sensibility',
    author_id: ObjectId("author1"),
    published: 1811,
    genre: 'Romantic Novel'
  }
]

Upsert: Actualizar o insertar

Podemos usar la opción upsert para actualizar un documento o crearlo si no existe:

db.books.updateOne(
    { title: "Oliver Twist" },
    { $set: {
        author_id: ObjectId("author2"),
        published: 1837,
        genre: "Historical Fiction"
    }},
    { upsert: true }
)

Consultar padre e hijos

En este paso, exploraremos técnicas de consulta avanzadas para recuperar documentos relacionados en colecciones padre e hijo en MongoDB. Demonstraremos cómo encontrar y unir datos relacionados de manera efectiva.

Consultas de filtrado básico

Comencemos buscando libros de un autor específico:

db.books.find({ author_id: ObjectId("author1") })

Filtrado con múltiples condiciones

Consulte libros con múltiples filtros:

db.books.find({
    author_id: ObjectId("author1"),
    published: { $gt: 1812 }
})

Esta consulta encuentra libros de Jane Austen publicados después de 1812.

Pipeline de agregación para consultas complejas

Utilice el marco de agregación para unir información de autores y libros:

db.books.aggregate([
    { $lookup: {
        from: "authors",
        localField: "author_id",
        foreignField: "_id",
        as: "author_details"
    }},
    { $match: {
        "author_details.nationality": "British"
    }},
    { $project: {
        title: 1,
        published: 1,
        "author_name": "$author_details.name"
    }}
])
Salida de ejemplo
[
  {
    _id: ObjectId(...),
    title: 'Pride and Prejudice',
    published: 1813,
    author_name: ['Jane Austen']
  },
  {
    _id: ObjectId(...),
    title: 'Emma',
    published: 1815,
    author_name: ['Charles Dickens']
  }
]

Ordenar y limitar resultados

Consulte y ordene libros por año de publicación:

db.books.find()
  .sort({ published: 1 })
  .limit(2)

Esto recupera los dos libros publicados más temprano.

Filtrado avanzado con expresiones regulares

Encuentre libros con títulos que contengan palabras específicas:

db.books.find({
    title: { $regex: /Sense/, $options: 'i' }
})

La opción $options: 'i' hace que la búsqueda sea insensible a mayúsculas y minúsculas.

Contar documentos relacionados

Cuente los libros de cada autor:

db.books.aggregate([
    { $group: {
        _id: "$author_id",
        book_count: { $sum: 1 }
    }},
    { $lookup: {
        from: "authors",
        localField: "_id",
        foreignField: "_id",
        as: "author_info"
    }},
    { $project: {
        author_name: "$author_info.name",
        book_count: 1
    }}
])
Salida de ejemplo
[
  {
    _id: ObjectId("author1"),
    author_name: ['Jane Austen'],
    book_count: 2
  },
  {
    _id: ObjectId("author2"),
    author_name: ['Charles Dickens'],
    book_count: 2
  }
]

Mantenimiento de referencias

En este último paso, exploraremos estrategias para mantener referencias de documentos en MongoDB, centrándonos en la integridad de los datos, la limpieza y las mejores prácticas para administrar las relaciones entre colecciones.

Manejo de referencias huérfanas

A veces, las referencias pueden quedar desactualizadas cuando se eliminan documentos padre. Veamos cómo manejar esto:

Crear un autor y un libro de prueba

db.authors.insertOne({
    _id: ObjectId("author3"),
    name: "Mark Twain",
    nationality: "American",
    birthYear: 1835
})

db.books.insertOne({
    title: "The Adventures of Tom Sawyer",
    author_id: ObjectId("author3"),
    published: 1876,
    genre: "Classic Literature"
})

Simular la limpieza de referencias

Eliminar un autor y comprobar los libros huérfanos:

db.authors.deleteOne({ _id: ObjectId("author3") })

## Encontrar libros con referencias de autor no existentes
db.books.find({
    author_id: { $nin: db.authors.distinct("_id") }
})

Implementación de la gestión de referencias

Crear una función para limpiar referencias huérfanas:

db.books.deleteMany({
    author_id: { $nin: db.authors.distinct("_id") }
})

Evitar referencias no válidas

Utilizar reglas de validación al insertar documentos:

db.createCollection("books", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["title", "author_id"],
         properties: {
            title: {
               bsonType: "string",
               description: "debe ser una cadena y es obligatoria"
            },
            author_id: {
               bsonType: "objectId",
               description: "debe ser una referencia de autor válida"
            }
         }
      }
   }
})

Indexación de referencias para mejorar el rendimiento

Crear un índice en el campo de referencia:

db.books.createIndex({ author_id: 1 })

Comprobar la creación del índice

db.books.getIndexes()
Salida de ejemplo
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { author_id: 1 }, name: 'author_id_1' }
]

Mejores prácticas para la gestión de referencias

  1. Siempre validar referencias antes de insertar
  2. Utilizar índices en campos de referencia
  3. Implementar mecanismos de limpieza
  4. Considerar el uso de transacciones de base de datos para operaciones complejas

Demostración de la validación de referencias

## Esto fallará debido a un author_id no válido
db.books.insertOne({
    title: "Invalid Book",
    author_id: ObjectId("invalid_id")
})

Resumen

En este laboratorio, aprendimos cómo diseñar relaciones de datos en MongoDB utilizando referencias de documentos. Creamos un ejemplo práctico de un sistema de gestión de bibliotecas, modelando libros y autores. Exploramos las dos principales maneras de crear relaciones en MongoDB: documentos incrustados y referencias de documentos. Para nuestro sistema de bibliotecas, optamos por utilizar referencias de documentos para vincular datos relacionados entre colecciones. Aprendimos los principios clave de las referencias de documentos, como utilizar _id para crear enlaces, mantener las referencias simples y consistentes, y elegir referencias cuando los datos son grandes o cambian con frecuencia. También expandimos nuestra base de datos de biblioteca creando relaciones más complejas entre documentos padre e hijo.

OSZAR »