Javascript NodeJS+;mongoose正在等待子查询

Javascript NodeJS+;mongoose正在等待子查询,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我有两个模型:ModelA和ModelB,我试图将tags=Array()列从ModelB复制到ModelA,如下所示: function run() { ModelA.find({}).limit(500).cursor() .on('data', function(doc) { let refID = doc.ref_id; ModelB.findOne({_id: refID}).exec(function(err, modelb) {

我有两个模型:
ModelA
ModelB
,我试图将
tags=Array()
列从
ModelB
复制到
ModelA
,如下所示:

function run() {

  ModelA.find({}).limit(500).cursor()
    .on('data', function(doc) {
      let refID = doc.ref_id;

      ModelB.findOne({_id: refID}).exec(function(err, modelb) {
        if (err) {
          console.log(`[Error]: Getting modelb ${refID}`);
        }
        if (modelb) {
          if (modelb.tags.length > 0) {
            doc.tags = modelb.tags;
          }
        }
      });

      doc.processed = true;
      doc.save(function(err, hackAlert) {
        if (err) {
          console.log('[Error]: Saving ModelA: ' + err);
        }
        console.log(`Saved: ${doc._id}`);
      });
    })
    .on('error', function(err){
      console.log('[Error]');
    })
    .on('end', function(){
      console.log('Done');
    });
}
脚本显然使用
processed=true
保存了所有
ModelA
实例,但考虑到节点的异步性质,
ModelA
文档最终没有
标记


如果你不知道的话,我是新手。我想知道在保存
ModelA
之前完成
ModelB.findOne()
查询的
等待
的最佳现代方式是什么?

您只需移动要在第一次查询回调时调用的代码:

function run() {

  ModelA.find({}).limit(500).cursor()
    .on('data', function(doc) {
      let refID = doc.ref_id;

      ModelB.findOne({_id: refID}).exec(function(err, modelb) {
        if (err) {
          console.log(`[Error]: Getting modelb ${refID}`);
        }
        if (modelb) {
          if (modelb.tags.length > 0) {
            doc.tags = modelb.tags;
          }
        }
        doc.processed = true;
        doc.save(function(err, hackAlert) {
          if (err) {
            console.log('[Error]: Saving ModelA: ' + err);
          }
          console.log(`Saved: ${doc._id}`);
        });
      });
    })
    .on('error', function(err){
      console.log('[Error]');
    })
    .on('end', function(){
      console.log('Done');
    });
}
对于使用
async/await
Promises
的最新方法:

async function run () {

  ModelA.find({}).limit(500).cursor()
    .on('data', async function (doc) {
      let refID = doc.ref_id;
      const modelb = await ModelB.findOne({_id: refID}).exec()
        .catch(() => console.log(`[Error]: Getting modelb ${refID}`));

      if (modelb) {
        if (modelb.tags.length > 0) {
          doc.tags = modelb.tags;
        }
      }
      doc.processed = true;
      await doc.save().exec()
        .catch(err => console.log('[Error]: Saving ModelA: ' + err))

      console.log(`Saved: ${doc._id}`);
    })
    .on('error', function (err){
      console.log('[Error]');
    })
    .on('end', function () {
      console.log('Done');
    });
}

谢谢,我一直在寻找类似于您的第二种方法的东西,第一种方法不适合我,因为
findOne
可能找不到任何相关文档,我仍然需要将
ModelA
文档保存为
processed=true
。谢谢你的帮助没问题!第一种方法也应该更新文档,因为
回调
无论如何都应该执行,但第二种方法更干净。