Muy buena explicación.
Introducción
¿Ya tomaste el Curso de NestJS: Programación Modular?
Instalación de Docker para este curso
Instalación de Platzi Store y presentación
Database
Configuración de Docker para MongoDB
Exploración de la base de datos con Mongo Compass
Instalando y conectando MongoDB Driver
Conexión como inyectable
Ejecutando un query
Usando variables de ambiente en Mongo
Mongoose
¿Qué es Mongoose? Instalación y configuración
Implementando Mongoose en Módulos
Conectando Mongo a los servicios
Create, update y delete
Pipe para mongoid
Agregando paginación
Agregando un filtro de rango para precios
Agregando indexadores
Relaciones en MongoDB
Relaciones uno a uno embebidas
Relaciones uno a uno referenciadas
Relaciones uno a muchos embebidas
Cómo tipar relaciones uno a muchos embebidas
Relaciones uno a muchos referenciadas
Manipulación de arrays en MongoDB
Próximos pasos
Continúa con el Curso de NestJS: Autenticación con Passport y JWT
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Nicolas Molina
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.
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": "..."
}
}
Implementar esta lógica con Mongoose y NestJS es muy sencillo.
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.
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).
// 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
}
Aportes 5
Preguntas 3
Muy buena explicación.
NoSql significa Not Only SQL, Claro que una base de datos NoSql puede tener relaciones como cualquier base de datos SQL
Es un genio Nico. tengo que mirar mil veces los videos para aprender TOOODOO lo que enseña! Gracias Profe
Genial!
SUPER! ya lo habia hecho pero no sabia que era una relacion embebida 😮
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?