Javascript MongoDB在foreach循环中更新文档失败

Javascript MongoDB在foreach循环中更新文档失败,javascript,node.js,mongodb,asynchronous,mongoose,Javascript,Node.js,Mongodb,Asynchronous,Mongoose,我在一个网站上工作,我们每天都会收到JS阵列中的订单,如下所示: let todayOrders = [ { order_name: "apple", order_count: 2 }, { order_name: "orange", order_count: 3 }, { order_name: "apple",

我在一个网站上工作,我们每天都会收到JS阵列中的订单,如下所示:

let todayOrders = [
    {
        order_name: "apple",
        order_count: 2
    },
    {
        order_name: "orange",
        order_count: 3
    },
    {
        order_name: "apple",
        order_count: 1
    }
];
todayOrders.forEach(function(item, index){
    Product.updateOne(
        {
            product_name: item.order_name
        },
        {
            $inc: {product_count: item1.order_count}
        },
    );
});
我需要将每个订单计数添加到total order count文档中,该文档跟踪每个订单。因此,我在其中使用了foreach循环和
updateOne
方法,如下所示:

let todayOrders = [
    {
        order_name: "apple",
        order_count: 2
    },
    {
        order_name: "orange",
        order_count: 3
    },
    {
        order_name: "apple",
        order_count: 1
    }
];
todayOrders.forEach(function(item, index){
    Product.updateOne(
        {
            product_name: item.order_name
        },
        {
            $inc: {product_count: item1.order_count}
        },
    );
});

问题是,只有当
todayOrders
不包含任何重复的
order\u name
时,此代码才能正常工作,在这种情况下,它不会应用所有更改。我相信这与猫鼬的异步行为有关。

可能会对订单进行分组

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(...)

您不是在等待您的承诺得到解决,这被认为是可能导致意外行为的不良做法,在您的情况下,它不应该影响预期的逻辑,因为单个文档上的Mongo write运算符是原子的

然而,我仍然建议您重构代码,直到承诺得到解决,这不能用
forEach
完成,因为它没有返回值

下面是一个快速的示例,说明了如何做到这一点:

for (const item of todayOrders) {
    await Product.updateOne(
        {
            product_name: item.order_name
        },
        {
            $inc: {product_count: item1.order_count}
        },
    );
}


对于并行运行,我建议您使用类似,但是您可以使用js native promise自己执行。

item1应该是item。跟踪“总计”订单需要$inc而不是$setYep。我的错在那一点上。