【问题标题】:optimise update query function which update more than 1000 records using async优化更新查询功能,使用异步更新超过 1000 条记录
【发布时间】:2018-11-22 14:55:30
【问题描述】:

我有一个功能可以根据特定条件更新 1000 多条记录。但是当我运行这个函数时,我得到Too many connection 错误,因为只有一半的记录得到更新。 如何使用 async 使此功能运行?它应该一口气更新所有记录

代码:

db.query("select *, date(login) as login_date from userRegister where logout IS NULL limit 10", function (err, user) {
  if (!_.size(user))
    return
var byCatId = _.groupBy(user, 'catId');
var grouppedArray = _.map(byCatId, function(array) {
                                        return _.groupBy(array, 'login_date')
                                    });
var i, j, k
  for (i in grouppedArray) {
    if (grouppedArray.hasOwnProperty(i)) {
      for (j in grouppedArray[i]) {
        if (grouppedArray[i].hasOwnProperty(j)) {
          if (grouppedArray[i][j].length > 1) {
          for(var k=0;k<grouppedArray[i][j].length;k++){
          if(grouppedArray[i][j][k+1]){
          var updatedLogOut = moment(grouppedArray[i][j][k+1].login).subtract(1, 'minutes').format('YYYY-MM-DD HH:mm:ss')
            async.eachSeries(db.query('update userRegister set  logout= ? where userId = ? and catId = ?', [updatedLogOut, 1, grouppedArray[i][j][k].userId, grouppedArray[i][j][k].catId], function (err, updatedLogout) {
                if (err) {
                    console.log(err)
                    return err
                   }
                  if (!_.size(updatedLogout))
                                    return
                                    console.log("Updated Successfully")
                                    return updatedLogout
            })
        }
    }
    }
                }
      }
    }
  }
})

【问题讨论】:

    标签: mysql node.js async.js


    【解决方案1】:

    根据docs,第一个参数是可迭代对象。您可以传递所有必须作为第一个参数更新的查询数组以及在执行时处理每个项目的函数。

    更新的代码,未经测试。

    var queries = []
    var i, j, k
    for (i in grouppedArray) {
        if (grouppedArray.hasOwnProperty(i)) {
            for (j in grouppedArray[i]) {
                if (grouppedArray[i].hasOwnProperty(j)) {
                    if (grouppedArray[i][j].length > 1) {
                        for (var k = 0; k < grouppedArray[i][j].length; k++) {
                            if (grouppedArray[i][j][k + 1]) {
                                var updatedLogOut = moment(grouppedArray[i][j][k + 1].login).subtract(1, 'minutes').format('YYYY-MM-DD HH:mm:ss')
                                queries.push([updatedLogOut, 1, grouppedArray[i][j][k].userId, grouppedArray[i][j][k].catId])
                            }
                        }
                    }
                }
            }
        }
    }
    
    
        async.eachSeries(queries, 
            function(item, done){
                db.query('update userRegister set  logout= ? where userId = ? and catId = ?', item , function (err, updatedLogout) {
                    done(err)
                })
            })
    

    希望对你有帮助

    【讨论】:

    • 非常感谢,完美运行 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多