使用猫鼬异步保存多个文档

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))

【讨论】:

以上是关于使用猫鼬异步保存多个文档的主要内容,如果未能解决你的问题,请参考以下文章

创建使用猫鼬更新和保存文档的方法?

如何使用猫鼬需要验证在猫鼬中插入多个文档?

猫鼬查找并保存不更新文档

使用猫鼬更新多个文档不起作用

如何在猫鼬中保存子文档的数组?

一次更新猫鼬中的多个文档