使用猫鼬异步保存多个文档
Posted
技术标签:
【中文标题】使用猫鼬异步保存多个文档【英文标题】:async save multiple document with mongoose 【发布时间】:2019-01-22 12:57:42 【问题描述】:我正在使用 mongoose.save() 更新 2 个文档,但我认为我这样做的方式并不安全,据我所知我需要使用异步来确保所有文档都正在执行
// array containing the 2 documents from db
let schedules
let newItem =
isActive: room.isActive,
name: room.roomname
;
// adding new items to nested array
schedules[0].rooms.push(newItem);
schedules[1].rooms.push(newItem);
// saving / updating documents
var total = schedules.length,
result = [];
function saveAll()
var doc = schedules.pop();
doc.save(function(err, saved)
if (err) throw err; //handle error
result.push(saved);
if (--total) saveAll();
else
// all saved here
res.json(result);
);
saveAll();
任何解释如何正确地做到这一点
【问题讨论】:
【参考方案1】:我们可以为此使用promise.all
,但我们需要将您的save
函数更改为基于promise 的函数
...
var total = schedules.length,
result = [];
function saveAll()
const promises = schedules.map(schedule => save(schedule));
return Promise.all(promises)
.then(responses =>
// all saved processes are finished
res.json(responses);
)
// convert callback `save` function to promise based
function save(doc)
return new Promise((resolve, reject) =>
doc.save((err, saved) =>
if (err)
reject(err);
resolve(saved);
);
);
如果您可以使用async/await
,我们可以使saveAll
功能更清洁
async function saveAll()
const promises = schedules.map(schedule => save(schedule));
const responses = await Promise.all(promises);
res.json(responses);
希望对你有帮助
【讨论】:
使用Promise.all( <array of mongo queries> )
可能是个坏主意,因为与 mongo 的连接池有限(我认为默认值为 5),所以这个命令可能会淹没池数百毫秒(或其他),阻止此进程对 mongo 的所有其他访问。【参考方案2】:
使用承诺:
doc1.save().exec().then(
data =>
doc1.save().exec().then(
data2 => console.log(data2)
).catch(err2 => console.log(err2))
).catch(err1 => console.log(err1))
【讨论】:
以上是关于使用猫鼬异步保存多个文档的主要内容,如果未能解决你的问题,请参考以下文章