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.tsexportclassOrdersService{asyncaddProducts(id:string, productsIds:string[]){const order =awaitthis.orderModel.findById(id); productsIds.forEach((pId)=> order.products.push(pId));return order.save();}asyncremoveProduct(id:string, productId:string){const order =awaitthis.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.
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:
$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.tsexportclassOrdersService{...asyncremoveProduct(id:string, productId:string){// 👈 const order =awaitthis.orderModel.findById(id); order.products.pull(productId);return order.save();}asyncaddProducts(id:string, productsIds:string[]){// 👈 const order =awaitthis.orderModel.findById(id); productsIds.forEach((pId)=> order.products.push(pId));return order.save();}}