Una de las decisiones más importantes al diseñar un sistema con MongoDB es elegir entre dos estrategias de modelado: documentos embebidos (desnormalización) y documentos referenciados (normalización). A diferencia de los sistemas relacionales donde las relaciones se modelan casi siempre con claves foráneas y JOINs, en MongoDB la respuesta depende del patrón de acceso a los datos, el volumen de los subdocumentos y la frecuencia con la que cada parte de la información se consulta o actualiza de forma independiente.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/tutosrive/db-nosql-2026-1/llms.txt
Use this file to discover all available pages before exploring further.
Documentos Embebidos
En el modelo embebido, los datos relacionados se almacenan directamente dentro del mismo documento, formando una estructura jerárquica anidada. MongoDB permite múltiples niveles de anidamiento sin límite de profundidad (aunque se recomienda no superar 3-4 niveles por claridad).¿Cuándo usar documentos embebidos?
- Los datos relacionados se consultan siempre juntos.
- La relación es uno-a-pocos (un usuario con 3-5 aficiones, un vehículo con sus comparendos).
- Los subdocumentos no se actualizan de forma independiente con frecuencia.
- Se quiere maximizar el rendimiento en lecturas evitando operaciones
$lookup.
Ejercicio de clase: dbvehiculos
El siguiente ejemplo proviene directamente de las notas del curso. Se modela la base de datos dbvehiculos con una colección persona_vehiculo, embebiendo la información del vehículo y su lista de comparendos en tres niveles de anidamiento:
- Nivel 1 — Documento raíz:
cedulapersona,nombrepersona,ciudad. - Nivel 2 — Subdocumento
vehiculo:placa,marca,modelo,comparendos. - Nivel 3 — Arreglo de subdocumentos
comparendos: cada elemento con la clavetipo.
Historial médico con arreglo de subdocumentos
Otro ejercicio de clase consiste en insertar, dentro de un documento de paciente, un campohistorial que contenga un subarreglo llamado medicos. Cada elemento del arreglo tiene dos claves: nombre y especialidad:
Documentos Referenciados
En el modelo referenciado, los documentos relacionados se almacenan en colecciones separadas y se vinculan mediante un campo identificador (equivalente a una clave foránea en SQL). Para unir los datos en una consulta se utiliza la etapa$lookup dentro de un pipeline de agregación.
¿Cuándo usar documentos referenciados?
- La relación es uno-a-muchos o muchos-a-muchos (un usuario con cientos de partidas, un equipo con decenas de partidos).
- Los subdocumentos se consultan o actualizan de forma independiente con frecuencia.
- El subdocumento puede crecer sin límite en el tiempo.
- Se quiere evitar duplicación de datos que cambian (ej. datos de un equipo referenciados desde múltiples partidos).
Ejemplo: usuarios y partidos
Las coleccionesusuarios y partidos del curso se modelan naturalmente como referencias, ya que un partido involucra a múltiples equipos y un equipo puede aparecer en muchos partidos:
usuarios y partidos conviven en colecciones separadas y se relacionan desde la lógica de aplicación o mediante $lookup. Por ejemplo, una colección apuestas puede referenciar tanto user_id como match_id sin necesidad de duplicar la información de cada colección.
Unir colecciones con $lookup
Cuándo Usar Cada Uno
- Comparación por criterio
- Regla general
| Criterio | Embebido | Referenciado |
|---|---|---|
| Acceso conjunto | ✅ Ideal — una sola consulta | Requiere $lookup |
| Relación 1:pocos | ✅ Ideal | Innecesario / sobrediseño |
| Relación 1:muchos | ⚠️ Puede crecer indefinidamente | ✅ Ideal |
| Relación muchos:muchos | ❌ Duplicación masiva | ✅ Ideal |
| Actualización independiente | ⚠️ Requiere actualizar el padre | ✅ Simple y directa |
| Documentos < 16 MB | ✅ Siempre OK | Requerido si el doc excede el límite |
| Rendimiento en lectura | ✅ Alta (sin JOIN) | Media (con $lookup) |
| Consistencia de datos | ⚠️ Sin transacciones puede desincronizarse | ✅ Fuente única de verdad |
Consultar Documentos Embebidos
Para filtrar por campos dentro de subdocumentos se utiliza la notación de punto ("campo.subcampo"). Esta sintaxis funciona en filtros, proyecciones y operaciones de actualización.
Historial con Médicos
Este ejercicio directo de clase modela un historial clínico donde dentro del campohistorial existe un arreglo medicos compuesto de subdocumentos con claves nombre y especialidad:
El operador
$push es la forma idiomática de agregar elementos a un arreglo existente sin sobreescribir los elementos anteriores. Si usaras $set sobre el campo del arreglo, reemplazarías todo el arreglo con el nuevo valor.