Introducción

En MongoDB, los documentos anidados permiten almacenar documentos dentro de otros documentos. Esta característica es una de las principales ventajas de MongoDB sobre las bases de datos relacionales, ya que permite una estructura de datos más flexible y natural. En esta sección, aprenderemos qué son los documentos anidados, cómo crearlos y cómo trabajar con ellos.

¿Qué son los Documentos Anidados?

Los documentos anidados son documentos que se encuentran dentro de otros documentos. Esto permite representar relaciones jerárquicas y estructuras complejas de datos de una manera más intuitiva y eficiente.

Ejemplo de Documento Anidado

{
  "nombre": "Juan Pérez",
  "edad": 30,
  "dirección": {
    "calle": "Calle Falsa 123",
    "ciudad": "Springfield",
    "país": "USA"
  },
  "contacto": {
    "teléfono": "555-1234",
    "email": "[email protected]"
  }
}

En este ejemplo, el documento principal contiene dos documentos anidados: dirección y contacto.

Creando Documentos Anidados

Para crear documentos anidados en MongoDB, simplemente incluimos un documento dentro de otro documento al momento de la inserción.

Ejemplo en JavaScript (Node.js)

const { MongoClient } = require('mongodb');

async function run() {
  const uri = "mongodb://localhost:27017";
  const client = new MongoClient(uri);

  try {
    await client.connect();
    const database = client.db('miBaseDeDatos');
    const collection = database.collection('usuarios');

    const nuevoUsuario = {
      nombre: "Juan Pérez",
      edad: 30,
      dirección: {
        calle: "Calle Falsa 123",
        ciudad: "Springfield",
        país: "USA"
      },
      contacto: {
        teléfono: "555-1234",
        email: "[email protected]"
      }
    };

    const resultado = await collection.insertOne(nuevoUsuario);
    console.log(`Documento insertado con el _id: ${resultado.insertedId}`);
  } finally {
    await client.close();
  }
}

run().catch(console.dir);

En este ejemplo, estamos insertando un documento con dos documentos anidados (dirección y contacto) en la colección usuarios.

Leyendo Documentos Anidados

Para leer documentos anidados, utilizamos la misma sintaxis que para leer documentos simples, pero especificamos el campo anidado utilizando la notación de punto.

Ejemplo en JavaScript (Node.js)

async function leerDocumento() {
  const uri = "mongodb://localhost:27017";
  const client = new MongoClient(uri);

  try {
    await client.connect();
    const database = client.db('miBaseDeDatos');
    const collection = database.collection('usuarios');

    const usuario = await collection.findOne({ "nombre": "Juan Pérez" });
    console.log(usuario);
  } finally {
    await client.close();
  }
}

leerDocumento().catch(console.dir);

En este ejemplo, estamos leyendo un documento de la colección usuarios donde el campo nombre es "Juan Pérez".

Actualizando Documentos Anidados

Para actualizar documentos anidados, utilizamos la notación de punto para especificar el campo anidado que queremos actualizar.

Ejemplo en JavaScript (Node.js)

async function actualizarDocumento() {
  const uri = "mongodb://localhost:27017";
  const client = new MongoClient(uri);

  try {
    await client.connect();
    const database = client.db('miBaseDeDatos');
    const collection = database.collection('usuarios');

    const filtro = { "nombre": "Juan Pérez" };
    const actualización = {
      $set: { "dirección.ciudad": "Shelbyville" }
    };

    const resultado = await collection.updateOne(filtro, actualización);
    console.log(`Documentos actualizados: ${resultado.modifiedCount}`);
  } finally {
    await client.close();
  }
}

actualizarDocumento().catch(console.dir);

En este ejemplo, estamos actualizando el campo ciudad del documento anidado dirección para el usuario "Juan Pérez".

Eliminando Documentos Anidados

Para eliminar campos de documentos anidados, utilizamos la notación de punto con el operador $unset.

Ejemplo en JavaScript (Node.js)

async function eliminarCampoAnidado() {
  const uri = "mongodb://localhost:27017";
  const client = new MongoClient(uri);

  try {
    await client.connect();
    const database = client.db('miBaseDeDatos');
    const collection = database.collection('usuarios');

    const filtro = { "nombre": "Juan Pérez" };
    const eliminación = {
      $unset: { "contacto.teléfono": "" }
    };

    const resultado = await collection.updateOne(filtro, eliminación);
    console.log(`Documentos actualizados: ${resultado.modifiedCount}`);
  } finally {
    await client.close();
  }
}

eliminarCampoAnidado().catch(console.dir);

En este ejemplo, estamos eliminando el campo teléfono del documento anidado contacto para el usuario "Juan Pérez".

Ejercicios Prácticos

Ejercicio 1: Crear un Documento Anidado

Instrucciones:

  1. Crea un documento en la colección productos con los siguientes campos:
    • nombre: "Laptop"
    • precio: 1200
    • especificaciones: un documento anidado con los campos procesador, ram y almacenamiento.

Solución:

const nuevoProducto = {
  nombre: "Laptop",
  precio: 1200,
  especificaciones: {
    procesador: "Intel i7",
    ram: "16GB",
    almacenamiento: "512GB SSD"
  }
};

await collection.insertOne(nuevoProducto);

Ejercicio 2: Leer un Documento Anidado

Instrucciones:

  1. Lee el documento de la colección productos donde el campo nombre es "Laptop" y muestra las especificaciones.

Solución:

const producto = await collection.findOne({ "nombre": "Laptop" });
console.log(producto.especificaciones);

Ejercicio 3: Actualizar un Documento Anidado

Instrucciones:

  1. Actualiza el campo ram del documento anidado especificaciones para el producto "Laptop" a "32GB".

Solución:

const filtro = { "nombre": "Laptop" };
const actualización = {
  $set: { "especificaciones.ram": "32GB" }
};

await collection.updateOne(filtro, actualización);

Ejercicio 4: Eliminar un Campo Anidado

Instrucciones:

  1. Elimina el campo almacenamiento del documento anidado especificaciones para el producto "Laptop".

Solución:

const filtro = { "nombre": "Laptop" };
const eliminación = {
  $unset: { "especificaciones.almacenamiento": "" }
};

await collection.updateOne(filtro, eliminación);

Conclusión

En esta sección, hemos aprendido sobre los documentos anidados en MongoDB, cómo crearlos, leerlos, actualizarlos y eliminarlos. Los documentos anidados permiten una estructura de datos más flexible y natural, lo que es una de las principales ventajas de MongoDB sobre las bases de datos relacionales. Con estos conocimientos, estás listo para manejar estructuras de datos más complejas en tus aplicaciones MongoDB. En la próxima sección, exploraremos las referencias en MongoDB y cómo utilizarlas para modelar relaciones entre documentos.

© Copyright 2024. Todos los derechos reservados