Javascript MongoDB在foreach循环中更新文档失败
我在一个网站上工作,我们每天都会收到JS阵列中的订单,如下所示: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",
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。我的错在那一点上。