No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Relaciones uno a uno embebidas

18/24
Recursos

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
}

Aportes 5

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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 馃槷