在nodejs中插入批量数据的问题

Posted

技术标签:

【中文标题】在nodejs中插入批量数据的问题【英文标题】:Issue in inserting bulk data in nodejs 【发布时间】:2018-08-25 03:46:42 【问题描述】:

这是我的对象,

'name': 'Lipika', 'monday': 1
'name': 'Ram', 'monday': 0
'name': 'Lipika', 'tuesday': 1
'name': 'Ram', 'tuesday': 0

这是两个条件

我想检查 Lipika 是否存在于数据库中,如果不存在,我应该在用户集合中创建他的名字,然后插入到出勤集合中,如果已经存在,那么我应该插入出勤集合。

这是我尝试过的

for (var key in row) 
checkUser(name,function(data) 
//Insert inside Attendence collection then..
);



function checkUser(name, callback)
  dbModel.User.findOne( name: name, function (err, data) 
    if(data)
        callback('exist');
    else
        var User = new dbModel.User(name : name);
        User.save(function (err) 
        if (err) 
            console.log('Err',err);
         else 
            callback('not exist');
        
        ); 
    
  );

但是当 nodejs 以异步方式运行时,它会创建 Lipika 和 Ram 两次。我怎样才能等到 javascript 检查并插入用户内部?

【问题讨论】:

你是通过lipika和ram两次吗? 是的,因为它在对象中有两次 【参考方案1】:

试试这个代码可能对你有帮助!

 function checkUser(name, callback)
      dbModel.User.findOne( name: name).then((data)=>
        if(data)
            //callback('exist');
        //user already present insert attendance
        else
            var User = new dbModel.User(name : name);
            User.save().then((data)=>
            //user not present insert collection
            ,(err)=

            );
        
    ,(error)=>
        console.log('something went wrong');
    );
    

【讨论】:

【参考方案2】:

您为什么不让名称字段唯一,而不是每次检查数据库,这将给出更准确的结果。因为如果多个请求同时出现,读取和写入会产生问题。

使用findAndModify避免2次操作读写。不好的方法:(

dbModel.User.findAndModify(
    query: 
        name: name
    ,
    update: 
        $setOnInsert: 
            name: name
        
    ,
    new: true,
    upsert: true
, (err, data) => 
    callback('exist');
);

【讨论】:

以上是关于在nodejs中插入批量数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

nodejs mysql批量插入重复密钥更新

在mysql Sequelize + Nodejs中将数组和对象转换为批量插入

使用 mysql2 和 NodeJs 批量插入会抛出 500

Javascript(NodeJs) - 将数组和对象转换为 mysql 中的批量插入(Sequelize)

我应该如何批量上传到 s3 并通过最终回调从 nodeJS 网络服务器插入到 MongoDB?

eggjs mysql 批量插入多条