Javascript 将csv转换为json并删除重复项,同时使用nodejs将数据保存到mongodb

Javascript 将csv转换为json并删除重复项,同时使用nodejs将数据保存到mongodb,javascript,node.js,json,mongodb,mongoose,Javascript,Node.js,Json,Mongodb,Mongoose,//products.csv |唯一代码|名称| |:---------- | --------:| |0001 |鼠标| |0002 |键盘| |0003 |监视器| |0001 |鼠标| //将csv转换为json并将数据保存到mongodb的代码 const csv=require(“csvtojson”); router.post(“/uploadProducts”),异步(请求、回复)=>{ const products=wait csv().fromFile(“./products

//products.csv |唯一代码|名称| |:---------- | --------:| |0001 |鼠标| |0002 |键盘| |0003 |监视器| |0001 |鼠标|

//将csv转换为json并将数据保存到mongodb的代码

const csv=require(“csvtojson”);
router.post(“/uploadProducts”),异步(请求、回复)=>{
const products=wait csv().fromFile(“./products.csv”);
试一试{
products.map(异步(pdata)=>{
让uniqueCode=wait Product.findOne({
产品代码:pdata.productCode,
});
如果(!唯一代码){
//创建新对象
让产品=新产品({
产品代码:pdata.productCode,
产品名称:pdata.name,
});
等待产品。保存();
}
});
res.send(“成功”);
}捕捉(错误){
控制台错误(err);
}

})
有两个问题:

  • product.save()
    也是异步的,但不是通过
    wait
    等待的。这样,如果您在随后的两行中有一个id相同的产品,则在处理第二行并使用
    product.findOne
    检查数据库时,很可能尚未插入前一行的产品,因此保护检查失败,您插入了另一项

  • 您向
    映射提供了一个异步函数。每个异步函数都返回一个承诺。这样,您的
    映射可能在对MongoDB的任何调用到达数据库并将您的产品数组转换为运行异步的承诺数组之前就完成了。因此,您对数据库调用的执行顺序没有影响,也不能期望它们按顺序运行。这意味着,对于您的所有产品,在调用
    product.save()
    之前,很可能已经调用了
    findOne
    函数,因此,对于具有相同id的所有产品,如果它们在调用过程之前不在数据库中,则返回false。这还意味着在完成整个数据库操作之前,您需要很长时间才能向客户机发送success

  • 解决方案: 在将CSV文件发送到数据库之前,请清除其中的重复项。它还将使您的程序更高效。然后使用此列表中的函数,一切都将按预期工作