Operaciones CRUD con MongoDB y Node.js en un Servicio de Productos

Clase 12 de 24Curso de NestJS: Persistencia de Datos con MongoDB

Resumen

Establecida la conexión a la base de datos con Mongoose y creadas las entidades que mapean la información, es momento de realizar las consultas a la base de datos desde los servicios.

Ejecutando consultas con Mongoose

Aquí tienes una serie de pasos que te ayudarán durante este proceso.

Paso 1: importación del esquema en los servicios

Comienza inyectando el esquema creado en el servicio que será el responsable de realizar las consultas.

// modules/products/products.service.ts
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';

@Injectable()
export class ProductsService {

  constructor(@InjectModel(Product.name) private productModel: Model<Product>) {}

  findAll() {
    return this.productModel.find().exec();
  }

  findOne(id: string) {
    return this.productModel.findById(id).exec();
  }
}

Utilizando InjectModel, inyectas el esquema de productos en el servicio de productos.

Paso 2: importación del servicio en los controladores

Los servicios son los responsables de realizar las consultas a la base de datos, pero los controladores son quienes determinan cuándo hay que realizar esas consultas.

// module/products/products.controller.ts
@Controller('products')
export class ProductsController {

  @Get()
  async getAll() {
    return await this.productsService.findAll();
  }

  @Get(':productId')
  async getOne(@Param('productId') productId: string) {
    return await this.productsService.findOne(productId);
  }
}

Crea tantos endpoints como necesites para responder a la necesidad de obtención de los datos a través de GET.
Así, ya tienes completada tu conexión a la base de datos y obtención de datos en tu API a través de Mongoose y sus esquemas.

Contribución creada por: Kevin Fiorentino (Platzi Contributor).


Código de ejemplo para conectar Mongo a los servicios

// src/products/services/products.service.ts

import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';

...

@Injectable()
export class ProductsService {
  constructor(
    @InjectModel(Product.name) private productModel: Model<Product>, // 👈
  ) {}
  ...

  findAll() { // 👈
    return this.productModel.find().exec();
  }

  async findOne(id: string) {  // 👈
    const product = await this.productModel.findById(id).exec();
    if (!product) {
      throw new NotFoundException(`Product #${id} not found`);
    }
    return product;
  }
  ...

}
// src/products/controllers/products.controller.ts

@Controller('products')
export class ProductsController {
   ...

  @Get(':productId')
  getOne(@Param('productId') productId: string) {   // 👈
    return this.productsService.findOne(productId);
  }
}
// src/users/services/users.service.ts
@Injectable()
export class UsersService {
  ...

  async getOrderByUser(id: number) {   // 👈
    const user = this.findOne(id);
    return {
      date: new Date(),
      user,
      products: await this.productsService.findAll(),   // 👈 implement await
    };
  }
}