Manipulación de Arrays en E-commerce: Métodos y Endpoints
Clase 23 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
07:55 min - 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
Viendo ahora
Próximos pasos
Los esquemas que contienen propiedades tipo Array deben manipularse de una forma especial. Haciendo los típicos push/pullpara agregar/quitar elementos, pero considerando la asincronía y que estos arrays se guardan en una base de datos.
Agregar y quitar elementos en un array
Veamos cómo es posible agregar/quitar elementos de un array que forma parte de un documento en MongoDB:
// users/services/orders.service.ts
export class OrdersService {
async addProducts(id: string, productsIds: string[]) {
const order = await this.orderModel.findById(id);
productsIds.forEach((pId) => order.products.push(pId));
return order.save();
}
async removeProduct(id: string, productId: string) {
const order = await this.orderModel.findById(id);
order.products.pull(productId);
return order.save();
}
}
La función findById() devolverá la referencia del documento encontrado a través de su ID. Gracias a esto, puedes ejecutar otras acciones sobre ese mismo documento para agregar elementos a un array con push() o removerlos con pull(). Finalmente, la función save() actualizará en la base de datos el documento completo.
Del lado del controlador, haz una simple llamada a estas funciones que se encargarán de la manipulación de, en este caso, el array de productos.
// users/orders.controller.ts
import { CreateOrderDto, UpdateOrderDto, AddProductsToOrderDto } from '../dtos/order.dto';
@Controller('orders')
export class OrdersController {
@Put(':id/products')
addProducts(@Param('id') id: string, @Body() payload: AddProductsToOrderDto) {
return this.ordersService.addProducts(id, payload.productsIds);
}
@Delete(':id/product/:productId')
removeProduct(@Param('id') id: string, @Param('productId') productId: string) {
return this.ordersService.removeProduct(id, productId);
}
}
Ten en cuenta que este tipo de operaciones son asíncronas, dependiendo de cómo armes tu controlador y el servicio encargado de realizar las modificaciones en la base de datos.
Operadores especiales de MongoDB
Si trabajas directamente con MongoDB, tienes que conocer los operadores que implementa para la manipulación de arrays. Estos son:
- $addToSet para agregar items en un array
- $pull para eliminar items en un array
- $pullAll para eliminar todos los items en un array
De esta manera, tu mismo puedes crear las consultas a tu base de datos necesarias para manipular un array dentro de un documento, sin necesidad de que herramientas como Mongoose implementen una capa de abstracción que facilite la tarea.
Contribución creada por: Kevin Fiorentino (Platzi Contributor).
Código de ejemplo para manipulación de arrays
// src/users/services/orders.service.ts
export class OrdersService {
...
async removeProduct(id: string, productId: string) { // 👈
const order = await this.orderModel.findById(id);
order.products.pull(productId);
return order.save();
}
async addProducts(id: string, productsIds: string[]) { // 👈
const order = await this.orderModel.findById(id);
productsIds.forEach((pId) => order.products.push(pId));
return order.save();
}
}
// src/users/dtos/order.dto.ts
...
export class AddProductsToOrderDto {
@IsArray()
@IsNotEmpty()
readonly productsIds: string[];
}
// src/users/controllers/orders.controller.ts
import {
CreateOrderDto,
UpdateOrderDto,
AddProductsToOrderDto,
} from '../dtos/order.dto';
@Controller('orders')
export class OrdersController {
@Put(':id/products') // 👈 add product
addProducts(
@Param('id') id: string,
@Body() payload: AddProductsToOrderDto,
) {
return this.ordersService.addProducts(id, payload.productsIds);
}
@Delete(':id/product/:productId') // 👈 delete product
removeProduct(
@Param('id') id: string,
@Param('productId') productId: string,
) {
return this.ordersService.removeProduct(id, productId);
}
}