En MongoDB, los documentos pueden estar relacionados entre sí de varias maneras. Una de las formas más comunes de establecer relaciones entre documentos es mediante referencias. Las referencias permiten que un documento apunte a otro documento, lo que es útil para modelar relaciones entre entidades en una base de datos.

Conceptos Clave

  1. Referencias Manuales: Son referencias explícitas donde un documento contiene el _id de otro documento.
  2. DBRefs: Son una forma especial de referencia que incluye el nombre de la colección y el _id del documento referenciado.

Referencias Manuales

Las referencias manuales son simples y directas. Un documento contiene el _id de otro documento, lo que permite establecer una relación entre ellos.

Ejemplo Práctico

Supongamos que tenemos dos colecciones: authors y books. Queremos que cada libro tenga una referencia al autor que lo escribió.

// Documento en la colección "authors"
{
  "_id": ObjectId("60c72b2f9b1d8b3f4c8b4567"),
  "name": "J.K. Rowling"
}

// Documento en la colección "books"
{
  "title": "Harry Potter and the Philosopher's Stone",
  "author_id": ObjectId("60c72b2f9b1d8b3f4c8b4567")
}

En este ejemplo, el documento del libro contiene un campo author_id que almacena el _id del autor correspondiente.

Consultas con Referencias Manuales

Para obtener el autor de un libro, primero necesitamos leer el documento del libro y luego usar el author_id para buscar el autor en la colección authors.

// Obtener el libro
const book = db.books.findOne({ title: "Harry Potter and the Philosopher's Stone" });

// Obtener el autor usando el author_id del libro
const author = db.authors.findOne({ _id: book.author_id });

print(`El autor del libro es: ${author.name}`);

DBRefs

DBRefs son una forma más estructurada de referencias en MongoDB. Incluyen el nombre de la colección y el _id del documento referenciado.

Ejemplo Práctico

Usando el mismo ejemplo de authors y books, un DBRef se vería así:

// Documento en la colección "books" usando DBRef
{
  "title": "Harry Potter and the Philosopher's Stone",
  "author": {
    "$ref": "authors",
    "$id": ObjectId("60c72b2f9b1d8b3f4c8b4567")
  }
}

Consultas con DBRefs

Para resolver un DBRef, MongoDB no proporciona soporte automático en las consultas. Necesitamos realizar dos consultas manualmente, similar a las referencias manuales.

// Obtener el libro
const book = db.books.findOne({ title: "Harry Potter and the Philosopher's Stone" });

// Obtener el autor usando el DBRef
const author = db[book.author.$ref].findOne({ _id: book.author.$id });

print(`El autor del libro es: ${author.name}`);

Ejercicio Práctico

Ejercicio

  1. Crea dos colecciones: students y courses.
  2. Inserta documentos en ambas colecciones.
  3. Establece una referencia manual en los documentos de students para apuntar a los cursos que están tomando.
  4. Escribe una consulta para obtener el nombre del curso que está tomando un estudiante específico.

Solución

// Crear colecciones y documentos
db.students.insertOne({
  "_id": ObjectId("60c72b2f9b1d8b3f4c8b4568"),
  "name": "Alice",
  "course_id": ObjectId("60c72b2f9b1d8b3f4c8b4569")
});

db.courses.insertOne({
  "_id": ObjectId("60c72b2f9b1d8b3f4c8b4569"),
  "title": "Introduction to MongoDB"
});

// Obtener el estudiante
const student = db.students.findOne({ name: "Alice" });

// Obtener el curso usando el course_id del estudiante
const course = db.courses.findOne({ _id: student.course_id });

print(`El curso que está tomando Alice es: ${course.title}`);

Conclusión

Las referencias en MongoDB son una herramienta poderosa para modelar relaciones entre documentos. Las referencias manuales son simples y directas, mientras que los DBRefs proporcionan una estructura más formal. Comprender cómo usar y consultar estas referencias es crucial para diseñar esquemas de datos eficientes y efectivos en MongoDB.

En el próximo tema, exploraremos los diferentes tipos de datos que se pueden utilizar en MongoDB, lo que nos permitirá aprovechar al máximo las capacidades de esta base de datos NoSQL.

© Copyright 2024. Todos los derechos reservados