mongodb批量修改数据,其实有内部方法,db.[collectionName].update({查询器},{修改器}),不是这里讨论的重点。
今天要讨论的是,异步调用的update函数改为同步,逐条更新后统一返回结果。
因为update方法是异步函数,所以要用点技巧来编写。
首先明白异步转同步大概有两种方法:async/await和then。
平常使用时两个方法都可以,但是使用async.auto,各函数串行调用时,特别是带有for循环的调用中,建议使用async/await。
function updateData (tablename, querywhere, dataset) {
return new Promise((resolve) => {
mongodb.update(tablename, querywhere, dataset, function (err, queryresult) {
resolve({err: err, rets: queryresult})
})
})
}
再通过上层封装
async function forUpdate () {
let j = 1
let arr = []
for (let i = 0; i < len; i++) {
if (list[i]) {
const querywhere = {id: list[i].id}
const dataset = {$set: {
"time1": list[i].time1 * 1000,
"time2": list[i].time2 * 1000
}};
const d = await updateData('tablename', querywhere, dataset)
if (d.err == null) {
arr.push({successful: true, failreason: "OK"})
} else {
arr.push({successful: false, failreason: 'update error[1]'}) }
} else {
arr.push({successful: false, failreason: 'update error[0]'}) }
}
return arr
}
const rets = await forUpdate ()
console.log(rets)
这样就能成功将异步调用的update函数改为同步,循环后统一返回结果。