Incrustación: relaciones de uno a pocos
Incrustará subdocumentos para datos estrechamente relacionados y medirá la ventaja de rendimiento de lectura que ofrece ubicar junta la información relacionada.
Incrustación: relaciones de uno a pocos es una lección gratuita de MongoDB Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de MongoDB Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de MongoDB Academy incluye 4 lecciones en total.
¿Qué es la inclusión de documentos?
La inclusión consiste en almacenar los datos relacionados directamente dentro de un documento principal en lugar de hacerlo en una colección independiente. En vez de vincular dos colecciones mediante una clave foránea, se anidan los datos relacionados como un subdocumento o una matriz de subdocumentos. Esta es la herramienta de diseño más potente de MongoDB, ya que permite realizar una única lectura para recuperar el documento principal y todos sus datos relacionados a la vez.
La relación de uno a pocos
Existe una relación de uno a pocos cuando un documento principal tiene una cantidad pequeña y limitada de elementos secundarios, normalmente menos de unas pocas decenas. Algunos ejemplos clásicos son una publicación de blog y sus comentarios, un usuario y sus direcciones, o un pedido y sus líneas de detalle. Cuando la cantidad de elementos secundarios es predecible y pequeña, la inclusión casi siempre es la opción adecuada.
Incluir las direcciones de un usuario
Considere una colección users en la que cada usuario tiene una o dos direcciones de entrega. En lugar de utilizar una colección addresses independiente, inclúyalas directamente. De este modo, encontrar un usuario y sus direcciones requiere una sola consulta y ninguna combinación.
db.users.insertOne({
name: 'Alice',
email: 'alice@example.com',
addresses: [
{ label: 'home', street: '123 Maple St', city: 'Austin', zip: '78701' },
{ label: 'work', street: '456 Oak Ave', city: 'Austin', zip: '78702' }
]
});Leer datos incluidos en una sola consulta
Cuando los datos están incluidos, puede recuperar el documento principal y todos sus elementos secundarios con un único findOne. No necesita utilizar $lookup ni realizar un segundo viaje de ida y vuelta a la base de datos. Esto hace que las lecturas sean más rápidas y que el código de la aplicación sea más sencillo, ya que todo el grafo de objetos llega en una sola respuesta.
// Retrieve user AND their addresses in a single read
const user = await db.collection('users').findOne(
{ email: 'alice@example.com' },
{ projection: { name: 1, addresses: 1 } }
);
console.log(user.addresses); // Array of embedded address objectsActualizar un subdocumento incluido
Para actualizar un subdocumento incluido, utilice el operador posicional $ o la notación de puntos. Por ejemplo, para cambiar el código postal de la dirección particular de Alice, se selecciona el elemento específico de la matriz que coincide con una condición del filtro. Las actualizaciones de datos incluidos se realizan de forma atómica a nivel de documento; no se necesita ninguna transacción.
db.users.updateOne(
{ email: 'alice@example.com', 'addresses.label': 'home' },
{ $set: { 'addresses.$.zip': '78703' } }
);Ventaja de rendimiento en las lecturas
MongoDB almacena los documentos como bloques BSON contiguos en el disco. Al incluir los datos relacionados, el motor lee un solo bloque de almacenamiento en lugar de realizar dos escaneos independientes de colecciones. Esta ubicación conjunta de los datos relacionados es la razón principal por la que los documentos incluidos ofrecen un mejor rendimiento que las referencias en cargas de trabajo con muchas lecturas, donde el documento principal y sus elementos secundarios casi siempre se consultan juntos.
Inclusión de documentos en Mongoose
En Mongoose, se definen esquemas de subdocumentos y se anidan dentro del esquema principal. Mongoose trata las matrices incluidas como matrices de subdocumentos, lo que proporciona validación completa de tipos y hooks del ciclo de vida para cada elemento. El modelo principal guarda todo el árbol de forma atómica.
const addressSchema = new mongoose.Schema({
label: String,
street: String,
city: String,
zip: String
});
const userSchema = new mongoose.Schema({
name: String,
email: String,
addresses: [addressSchema] // embedded array of sub-documents
});
const User = mongoose.model('User', userSchema);Cuándo resulta especialmente útil la inclusión
La inclusión funciona mejor cuando: (1) los datos secundarios siempre se consultan junto con el documento principal; (2) la cantidad de elementos secundarios es pequeña y limitada; y (3) los elementos secundarios no necesitan un ciclo de vida independiente (por ejemplo, nunca se consultan ni actualizan de forma aislada). Si se cumplen las tres condiciones, la inclusión es casi con toda seguridad la opción óptima.
Límite de tamaño de los documentos
Cada documento de MongoDB tiene un límite de tamaño estricto de 16 MB. En las relaciones de uno a pocos, rara vez supone un problema: un usuario con diez direcciones o un pedido con veinte líneas de detalle se encuentra muy por debajo del límite. Sin embargo, debe supervisar el crecimiento de los documentos con el tiempo para asegurarse de que la inclusión no los acerque demasiado a ese límite.
Inclusión frente a referencias: comparación rápida
Utilice esta comparación rápida para orientar su elección:
- Inclusión: una consulta, actualizaciones atómicas y una cantidad pequeña y limitada de elementos secundarios
- Referencias: cantidad flexible de elementos secundarios, elementos secundarios compartidos y consultas independientes de elementos secundarios
En las relaciones de uno a pocos, la inclusión ofrece mejores resultados en casi todos los aspectos. Evita viajes de ida y vuelta adicionales por la red y mantiene sencillo el esquema.
Ejemplo práctico: etiquetas de una publicación de blog
Una publicación de blog normalmente tiene un conjunto pequeño y fijo de etiquetas. En lugar de mantener una colección tags independiente con referencias, incluya las etiquetas como una matriz de cadenas directamente en el documento de la publicación. Consultar publicaciones por etiqueta es eficiente con un índice multiclave en el campo tags, y leer una publicación siempre devuelve sus etiquetas en el mismo documento.
db.posts.insertOne({
title: 'Getting Started with MongoDB',
body: 'MongoDB is a document database...',
tags: ['mongodb', 'nosql', 'database'],
author: 'Alice',
createdAt: new Date()
});
// Index the tags array for fast tag-based lookups
db.posts.createIndex({ tags: 1 });Comprobación rápida
Compruebe su comprensión de los conceptos de MongoDB y las bases de datos NoSQL de esta lección.
Resumen de la lección
En esta lección ha aprendido que la inclusión coloca los datos relacionados dentro del documento principal, que las relaciones de uno a pocos se benefician de la inclusión porque una sola lectura recupera todos los datos y que Mongoose admite esquemas de subdocumentos para matrices incluidas con seguridad de tipos. A continuación exploraremos las referencias: cuándo vincular documentos entre colecciones en lugar de anidarlos.
Aprende JavaScript con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 30
- Lecciones
- 120
Preguntas frecuentes
¿La lección «Incrustación: relaciones de uno a pocos» es gratis?
Sí — el texto completo de «Incrustación: relaciones de uno a pocos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de MongoDB Academy, actualiza a CoddyKit PRO. El curso de MongoDB Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Incrustación: relaciones de uno a pocos»?
Incrustará subdocumentos para datos estrechamente relacionados y medirá la ventaja de rendimiento de lectura que ofrece ubicar junta la información relacionada. Practicas MongoDB Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar MongoDB Academy?
No se requiere experiencia previa. MongoDB Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Incrustación: relaciones de uno a pocos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de MongoDB Academy?
Sí. Cada lección de MongoDB Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Incrustación: relaciones de uno a pocos
- Referencias: relaciones de uno a muchos y de muchos a muchos
- El antipatrón de los arrays sin límite
- Marco de decisión para diseñar esquemas