Relaciones embebidas en MongoDB: Manejo y ejemplos prácticos
Clase 18 de 24 • Curso de NestJS: Persistencia de Datos con MongoDB
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
MongoDB es una base de datos No Relacional. Aun así, requerimos la posibilidad de crear relaciones entre documentos de diferentes colecciones y es posible hacerlo.
Documento dentro de otro documento
La relación más sencilla y más utilizada es guardando un documento dentro de otro, formando una relación uno a uno embebida.
{ "name": "Producto Uno", "category": { "name": "Category", "image": "..." } }
Implementación relación uno a uno
Implementar esta lógica con Mongoose y NestJS es muy sencillo.
Paso 1: preparar el esquema
Agrega la propiedad en tu esquema que contendrá el documento embebido.
// products/product.entity.ts import { Prop, Schema, SchemaFactory, raw } from '@nestjs/mongoose'; export class Product extends Document { @Prop( raw({ name: { type: String }, image: { type: String }, }) ) category: Record<string, any>; }
El decorador @Prop() recibe un raw() con la estructura del objeto que estará dentro del objeto principal. La relación es resuelta gracias al tipado Record propio de TypeScript.
Paso 2: validar sub documento
El DTO será el encargado de validar la estructura de este sub documento.
// products/dto/category.dto.ts import { IsString, IsNotEmpty, IsUrl } from 'class-validator'; export class CreateCategoryDto { @IsString() @IsNotEmpty() readonly name: string; @IsUrl() @IsNotEmpty() readonly image: string; }
Prepara el DTO para la creación de la categoría con los campos que le corresponde a la misma que estarán embebidos dentro del documento principal.
// products/products.dto.ts import { ValidateNested } from 'class-validator'; import { CreateCategoryDto } from './category.dtos'; export class CreateProductDto { @IsNotEmpty() @ValidateNested() @ApiProperty() readonly category: CreateCategoryDto; }
Importa el DTO de la categoría y utilízalo como propiedad para el DTO de creación de productos. Agrégale el decorador @ValidateNested() para que NestJS haga la validación de la estructura correspondiente del objeto dentro.
De esta sencilla manera, puedes crear relaciones uno a una, o guardar un objeto dentro de otro en MongoDB a la vez que válidas la estructura del mismo.
Contribución creada por: Kevin Fiorentino (Platzi Contributor).
Código de ejemplo para relaciones uno a uno embebidas
// src/products/entities/product.entity.ts import { Prop, Schema, SchemaFactory, raw } from '@nestjs/mongoose'; export class Product extends Document { ... @Prop( raw({ name: { type: String }, image: { type: String }, }), ) category: Record<string, any>; // 👈 new field }
// src/products/dtos/category.dtos.ts import { IsString, IsNotEmpty, IsUrl } from 'class-validator'; export class CreateCategoryDto { ... @IsUrl() @IsNotEmpty() readonly image: string; // 👈 new field }
// src/products/dtos/products.dtos.ts import { ValidateNested, // 👈 new decorator } from 'class-validator'; import { CreateCategoryDto } from './category.dtos'; // 👈 export class CreateProductDto { @IsNotEmpty() @ValidateNested() @ApiProperty() readonly category: CreateCategoryDto; // 👈 new field }