Relaciones embebidas en MongoDB: Manejo y ejemplos prácticos
Clase 18 de 24 • Curso de NestJS: Persistencia de Datos con MongoDB
Contenido del curso
- 4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Relaciones embebidas en MongoDB: Manejo y ejemplos prácticos
07:55 - 19

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

Relaciones Uno a Muchos en MongoDB: Arrays Embebidos vs Referenciados
09:28 - 21
Tipado de Documentos Embebidos en NestJS con Mongoose
01:49 - 22

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

Manipulación de Arrays en E-commerce: Métodos y Endpoints
13:08
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
}