Estoy trabajando en un sitio web que recibimos el pedido de todos los días en una matriz JS como esta:
let todayOrders = [ { order_name: "apple", order_count: 2 }, { order_name: "orange", order_count: 3 }, { order_name: "apple", order_count: 1 } ]; Necesito agregar cada recuento de pedidos al documento de recuento total de pedidos que realiza un seguimiento de cada pedido. Así que usé un bucle foreach y un método updateOne dentro de este como este:
todayOrders.forEach(function(item, index){ Product.updateOne( { product_name: item.order_name }, { $inc: {product_count: item1.order_count} }, ); }); El problema es que este código solo funciona bien si todayOrders no contiene ningún order_name duplicado, que en ese caso no aplica todos los cambios. Creo que tiene algo que ver con el comportamiento async de Mongoose.
Tal vez agrupar las órdenes.
todayOrders.reduce((acc,item)=>{ const index = acc.map(i=>i.order_name).indexOf(item.order_name); if(index === -1) acc.push(item); else acc[index].order_count += item.order_count; return acc; },[]).forEach(...)No está esperando que se resuelvan sus promesas, esto se considera una mala práctica que podría conducir a un comportamiento inesperado, en su caso no debería afectar la lógica prevista, ya que los operadores de escritura de Mongo en un solo documento son atómicos.
Sin embargo, todavía le recomiendo que refactorice su código para esperar hasta que se resuelva la promesa, esto no se puede hacer con forEach debido a que no tiene un valor de retorno.
Aquí hay un ejemplo rápido de cómo puedes hacerlo:
for (const item of todayOrders) { await Product.updateOne( { product_name: item.order_name }, { $inc: {product_count: item1.order_count} }, ); }O
// ### This is not recommended as it not limited by scale and can cause the app to run out of memory and crash ### const promises = []; todayOrders.forEach(function(item, index){ promises.push(Product.updateOne( { product_name: item.order_name }, { $inc: {product_count: item.order_count} }, )) }); await Promise.all(promises)Para la ejecución en paralelo, le recomiendo que use algo como bluebird , sin embargo, puede hacerlo usted mismo con js native promise.