Gestionar Documentos Incrustados en MongoDB

MongoDBBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá a gestionar eficazmente documentos incrustados en MongoDB. Los documentos incrustados, o documentos anidados, son una característica central del modelo de datos de MongoDB que le permite almacenar datos complejos y jerárquicos dentro de un único documento. Aprenderá una variedad de técnicas, que incluyen la creación de documentos con datos anidados, la actualización de campos específicos dentro de ellos, la eliminación de elementos y la consulta de estas estructuras complejas. También aprenderá a aplicar una estructura de datos coherente mediante la validación de esquemas. Estas habilidades son esenciales para construir aplicaciones robustas y eficientes con MongoDB.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 100%. Ha recibido una tasa de reseñas positivas del 93% por parte de los estudiantes.

Crear Documentos con Datos Anidados

En este paso, aprenderá a crear documentos con estructuras anidadas en MongoDB. Esta es una habilidad fundamental para modelar datos relacionados dentro de un único documento.

Primero, abra la Shell de MongoDB (mongosh) para comenzar a interactuar con la base de datos. Todos los comandos subsiguientes en este laboratorio se ejecutarán dentro de esta shell a menos que se especifique lo contrario.

mongosh

A continuación, cambie a una nueva base de datos llamada bookstore. Si esta base de datos no existe, MongoDB la creará por usted cuando almacene datos en ella por primera vez.

use bookstore

Ahora, creará una colección llamada books e insertará un único documento. Este documento contendrá objetos anidados y una matriz de objetos anidados, representando los detalles de un libro.

db.books.insertOne({
    title: "Advanced MongoDB",
    author: {
        name: "Jane Smith",
        contact: {
            email: "jane.smith@example.com",
            phone: "+1-555-123-4567"
        }
    },
    published: {
        year: 2023,
        publisher: "Tech Publications"
    },
    chapters: [
        { number: 1, title: "Introduction to Nested Documents" },
        { number: 2, title: "Advanced Document Structures" }
    ]
})

En el documento que acaba de crear:

  • author y published son documentos anidados (objetos).
  • El documento author contiene otro documento anidado, contact.
  • chapters es una matriz que contiene múltiples documentos anidados, cada uno representando un capítulo.

Para ver el documento y confirmar su estructura, utilice el método find().

db.books.find()

Debería ver la siguiente salida, confirmando que el documento se insertó correctamente. El _id es un identificador único generado automáticamente por MongoDB.

[
  {
    _id: ObjectId("..."),
    title: 'Advanced MongoDB',
    author: {
      name: 'Jane Smith',
      contact: {
        email: 'jane.smith@example.com',
        phone: '+1-555-123-4567'
      }
    },
    published: {
      year: 2023,
      publisher: 'Tech Publications'
    },
    chapters: [
      { number: 1, title: 'Introduction to Nested Documents' },
      { number: 2, title: 'Advanced Document Structures' }
    ]
  }
]

Actualizar Campos Anidados y Elementos de Array

Después de crear documentos, a menudo necesitará modificar partes de ellos. En este paso, aprenderá a actualizar campos específicos dentro de documentos y matrices anidadas. Debería seguir en la shell mongosh del paso anterior.

Primero, actualicemos la información de contacto del autor. Para hacer esto, utiliza el operador $set con notación de puntos para especificar la ruta exacta del campo que desea cambiar. Este comando cambiará el número de teléfono y agregará un nuevo campo website.

db.books.updateOne(
    { title: "Advanced MongoDB" },
    { $set: {
        "author.contact.phone": "+1-888-999-0000",
        "author.contact.website": "www.janesmith.com"
    } }
)

La notación de puntos "author.contact.phone" le indica a MongoDB que navegue dentro del objeto author, luego dentro del objeto contact, y actualice el campo phone.

A continuación, agregará un nuevo capítulo a la matriz chapters utilizando el operador $push.

db.books.updateOne(
    { title: "Advanced MongoDB" },
    { $push: {
        chapters: {
            number: 3,
            title: "MongoDB Advanced Techniques"
        }
    } }
)

También puede actualizar un elemento específico dentro de una matriz. Modifiquemos el título del primer capítulo. Utilizamos el operador posicional $, que actúa como un marcador de posición para el primer elemento de la matriz que coincide con la condición de la consulta ("chapters.number": 1).

db.books.updateOne(
    { title: "Advanced MongoDB", "chapters.number": 1 },
    { $set: {
        "chapters.$.title": "Introduction to Nested Documents (Revised)"
    } }
)

Para verificar todos los cambios, recupere el documento nuevamente. El método .pretty() formatea la salida para que sea más legible.

db.books.find({ title: "Advanced MongoDB" }).pretty()

La salida mostrará el número de teléfono actualizado, el nuevo sitio web, el tercer capítulo agregado y el título revisado del primer capítulo.

Eliminar Campos Anidados y Elementos de Array

En este paso, aprenderá a eliminar partes de sus documentos. Esto incluye eliminar campos específicos, documentos anidados completos y elementos de una matriz.

Primero, eliminemos el campo website de la información de contacto del autor utilizando el operador $unset. El valor proporcionado a $unset (en este caso, una cadena vacía "") no importa; el operador simplemente elimina el campo especificado.

db.books.updateOne(
    { title: "Advanced MongoDB" },
    { $unset: { "author.contact.website": "" } }
)

A continuación, eliminará un elemento de una matriz. Eliminemos el tercer capítulo (el que tiene number: 3) de la matriz chapters utilizando el operador $pull. El operador $pull elimina todos los elementos de la matriz que coinciden con la condición especificada.

db.books.updateOne(
    { title: "Advanced MongoDB" },
    { $pull: {
        chapters: { number: 3 }
    } }
)

Finalmente, puede eliminar un objeto anidado completo. Eliminemos el objeto contact del documento author, nuevamente utilizando el operador $unset.

db.books.updateOne(
    { title: "Advanced MongoDB" },
    { $unset: { "author.contact": "" } }
)

Para ver el resultado de estas operaciones de eliminación, consulte el documento nuevamente.

db.books.find({ title: "Advanced MongoDB" }).pretty()

La salida mostrará que el campo website y el objeto contact completo han desaparecido, y la matriz chapters ahora contiene solo dos elementos.

Consultar Documentos con Datos Anidados

La consulta es una operación fundamental de la base de datos. En este paso, aprenderá a consultar documentos basándose en valores dentro de objetos y matrices anidadas. Para asegurarnos de tener un conjunto de datos limpio para estos ejemplos, primero eliminaremos la colección books existente.

db.books.drop()

Ahora, inserte algunos documentos nuevos con diferentes estructuras anidadas para practicar la consulta.

db.books.insertMany([
    {
        title: "MongoDB Essentials",
        author: {
            name: "John Doe",
            experience: { years: 5, specialization: "Database Design" }
        },
        tags: ["beginner", "database", "nosql"],
        chapters: [
            { number: 1, title: "Introduction", pages: 25 },
            { number: 2, title: "Advanced Concepts", pages: 45 }
        ]
    },
    {
        title: "Advanced Database Techniques",
        author: {
            name: "Jane Smith",
            experience: { years: 8, specialization: "Distributed Systems" }
        },
        tags: ["advanced", "distributed", "nosql"],
        chapters: [
            { number: 1, title: "System Design", pages: 35 },
            { number: 2, title: "Performance Optimization", pages: 55 }
        ]
    }
])

Para encontrar un libro por un campo en un documento anidado, use la notación de puntos. Esta consulta encuentra el libro escrito por "John Doe".

db.books.find({ "author.name": "John Doe" })

Puede profundizar en estructuras anidadas. Esta consulta encuentra libros donde la especialización del autor es "Database Design".

db.books.find({ "author.experience.specialization": "Database Design" })

Para encontrar documentos donde una matriz contiene un valor específico, puede consultar el campo de la matriz directamente. Esto encuentra todos los libros etiquetados con "nosql".

db.books.find({ tags: "nosql" })

También puede consultar documentos donde un elemento de la matriz cumple una condición determinada. Esta consulta encuentra libros que tienen al menos un capítulo de más de 40 páginas, utilizando el operador $gt (mayor que).

db.books.find({ "chapters.pages": { $gt: 40 } })

Finalmente, puede combinar múltiples condiciones. Esta consulta encuentra libros etiquetados como "advanced" escritos por un autor con 5 o más años de experiencia ($gte significa mayor o igual que).

db.books.find({
    "author.experience.years": { $gte: 5 },
    tags: "advanced"
})

Forzar Estructura de Documentos con Validación de Esquema

Para mantener la consistencia de los datos, MongoDB le permite aplicar una estructura específica a los documentos de una colección utilizando la validación de JSON Schema. En este paso, creará una nueva colección con un validador para asegurar que todos los documentos cumplan con una estructura predefinida.

Primero, cree una nueva colección llamada courses. Al crearla, pasará una opción validator que contiene las reglas del esquema.

db.createCollection("courses", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["title", "instructor", "duration", "topics"],
         properties: {
            title: {
               bsonType: "string",
               description: "must be a string and is required"
            },
            instructor: {
               bsonType: "object",
               required: ["name", "email"],
               properties: {
                  name: { bsonType: "string" },
                  email: {
                     bsonType: "string",
                     pattern: "^.+@.+$"
                  }
               }
            },
            duration: {
               bsonType: "int",
               minimum: 1,
               maximum: 100
            },
            topics: {
               bsonType: "array",
               minItems: 1,
               items: { bsonType: "string" }
            }
         }
      }
   }
})

Este esquema requiere que cada documento tenga un title, instructor, duration y topics. También define el tipo de datos para cada campo, incluyendo reglas anidadas para el objeto instructor y la matriz topics.

Ahora, intente insertar un documento que cumpla con estas reglas. Esta operación debería tener éxito.

db.courses.insertOne({
   title: "MongoDB Advanced Techniques",
   instructor: {
      name: "Jane Smith",
      email: "jane.smith@example.com"
   },
   duration: 40,
   topics: ["Nested Documents", "Schema Validation"]
})

A continuación, intente insertar un documento que viole las reglas del esquema. Este documento tiene un tipo de datos incorrecto para instructor.name, un formato de correo electrónico inválido, una duration fuera del rango permitido y una matriz topics vacía.

db.courses.insertOne({
   title: "Invalid Course",
   instructor: {
      name: 123,
      email: "invalid-email"
   },
   duration: 200,
   topics: []
})

Esta inserción fallará, y MongoDB devolverá un error Document failed validation. Esto evita que se guarden datos inconsistentes y ayuda a mantener la integridad de su base de datos.

Resumen

En este laboratorio, ha aprendido las técnicas fundamentales para gestionar documentos incrustados en MongoDB. Comenzó creando documentos con estructuras anidadas complejas, incluyendo objetos y matrices. Luego practicó la actualización de campos específicos utilizando la notación de puntos y operadores como $set y $push. También aprendió a eliminar datos con $unset y $pull. Además, exploró cómo realizar consultas dirigidas a datos anidados y, finalmente, cómo aplicar la integridad de los datos definiendo y aplicando un validador JSON Schema a una colección. Estas habilidades son cruciales para construir aplicaciones que aprovechen eficazmente el modelo de documentos flexible de MongoDB.