我有两个模型:ModelAModelB,我试图将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');
    });
}


该脚本显然用ModelA保存了所有processed = true实例,但是鉴于Node的异步特性,ModelA文档最终都没有tags

如果您不知道,我是新手。我想知道在保存"await"之前完成ModelB.findOne()查询的最好的现代方式是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');
    });
}


对于使用async/awaitPromises的最新方法:

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');
    });
}

关于javascript - NodeJS + Mongoose 等待子查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57962100/

10-16 20:55