Contenido del curso
Database
- 4

Configuración y ejecución de MongoDB con Docker Compose
08:51 min - 5

Conexión a Base de Datos MongoDB con Mongo Compass
05:05 min - 6

Instalación y conexión de MongoDB en Node con driver oficial
06:59 min - 7

Inyección de Conexiones MongoDB en Servicios NestJS
06:57 min - 8

Consultas a MongoDB con Nest.js: Implementación de Endpoints
04:46 min - 9

Variables de Entorno para Configuración de MongoDB en Node.js
10:43 min
Mongoose
- 10

Instalación y Configuración de Mongoose con NestJS
07:52 min - 11

Definición de Esquemas en Mongoose para eCommerce con NestJS
07:45 min - 12

Operaciones CRUD con MongoDB y Node.js en un Servicio de Productos
09:29 min - 13

Creación, actualización y eliminación de productos en MongoDB
10:12 min - 14

Validación de MongoID con Pipes en NestJS
06:38 min - 15

Paginación en MongoDB con DTOs y Validaciones en NestJS
11:13 min - 16

Consultas Avanzadas con Rangos de Precios en MongoDB
07:30 min - 17

Indexación en MongoDB: Cómo optimizar consultas rápidas
03:11 min
Relaciones en MongoDB
- 18

Relaciones embebidas en MongoDB: Manejo y ejemplos prácticos
Viendo ahora - 19

Relaciones uno a uno referenciadas en MongoDB
12:20 min - 20

Relaciones Uno a Muchos en MongoDB: Arrays Embebidos vs Referenciados
09:28 min - 21

Tipado de Documentos Embebidos en NestJS con Mongoose
01:49 min - 22

Relaciones Uno a Muchos Referenciadas en MongoDB
14:36 min - 23

Manipulación de Arrays en E-commerce: Métodos y Endpoints
13:08 min
Próximos pasos
Relaciones embebidas en MongoDB: Manejo y ejemplos prácticos
Resumen
Trabajar con bases de datos no relacionales como MongoDB no significa renunciar a conectar información entre entidades. Aunque no existen relaciones transaccionales como en PostgreSQL o MySQL, MongoDB ofrece formas eficientes de vincular datos, y la más común en bases de datos documentales es la relación embebida: un documento dentro de otro documento.
¿Qué son las relaciones embebidas en MongoDB?
Cuando un producto necesita una categoría asociada, en lugar de crear una tabla aparte y usar foreign keys, simplemente se incluye un subdocumento con la información de la categoría dentro del documento del producto. Esta es la estrategia más utilizada en bases de datos documentales y resulta muy práctica.
Por ejemplo, un producto puede contener directamente un objeto category con propiedades como name e image. No hay una referencia externa: toda la información vive en el mismo documento.
¿Cómo se define un subdocumento con Mongoose en NestJS?
Para manejar relaciones embebidas en el esquema de Mongoose, se utiliza el decorador raw [01:42]. Este decorador permite definir un subobjeto directamente dentro del esquema principal:
- Se importa
rawdesde Mongoose/NestJS. - Se crea una nueva propiedad
categorycon el tipoRecord<string, any>. - Dentro del decorador
@Prop, se usaraw()para especificar los atributos del subdocumento.
El subdocumento de categoría queda definido con dos campos:
name: de tipostring.image: de tipostring.
De esta forma, Mongoose entiende que category no es un campo simple sino un objeto embebido con su propia estructura.
¿Cómo se valida un DTO anidado con class-validator?
El siguiente paso es asegurar que al crear un producto también se valide correctamente la información de la categoría embebida. Aquí entra en juego el concepto de validación en cascada con el decorador @ValidateNested() de class-validator [04:07].
El proceso es el siguiente:
- Se agrega
imageal DTO de categoría (CreateCategoryDTO) con la validación@IsUrl(), ya que se necesita una dirección válida. - Se importa
CreateCategoryDTOdentro deCreateProductDTO. - Se añade una propiedad
categoryde tipoCreateCategoryDTOcon los decoradores@ValidateNested()y@IsNotEmpty().
Esto significa que las validaciones del DTO de categoría se ejecutan automáticamente cuando se valida el DTO del producto. Si el cliente envía category como un string en lugar de un objeto, la validación lo rechaza. Si envía un objeto vacío, también lo rechaza indicando que faltan name e image.
¿Cómo se comporta la creación en la práctica?
Al probar el endpoint de creación en Insomnia [05:15], las validaciones funcionan paso a paso:
- Sin
category: el servidor responde que el campo no puede estar vacío. - Con
categorycomo string: indica que debe cumplir restricciones anidadas. - Con
categorycomo objeto vacío: exigenameeimage. - Con todos los campos completos: el producto se crea exitosamente con la categoría embebida.
Al verificar en Mongo Compass [06:30], el documento almacenado muestra category como un objeto con name e image, confirmando que la relación embebida quedó almacenada correctamente.
¿Es válido repetir información en bases de datos no relacionales?
Un punto fundamental: en bases de datos no relacionales no es incorrecto duplicar información [06:55]. Si muchos productos comparten la misma categoría y cada uno almacena una copia del subdocumento, esto es perfectamente aceptable. Es parte del diseño documental y favorece la velocidad de lectura al evitar joins costosos.
Sin embargo, también existe la posibilidad de usar relaciones referenciadas, donde en lugar de embeber el documento completo se almacena solo un identificador que apunta a otro documento en una colección separada. Esta alternativa es útil cuando la información referenciada cambia con frecuencia o se comparte entre muchas entidades.
Si te interesa conocer cómo implementar relaciones referenciadas uno a uno en MongoDB con NestJS, comparte tu experiencia con relaciones embebidas y cuéntanos en qué casos las has utilizado.