【问题标题】:How to Run a Mongoose Find inside a Foreach synchronously如何在 Foreach 中同步运行 Mongoose Find
【发布时间】:2019-09-09 10:49:03
【问题描述】:

我有一个集合“Case”的查询,对于每条记录,我需要匹配另一个集合“CustomerAgreement”。 所以我正在使用 forEach 并在其中调用第二个查询。问题是查询在 forEach 结束后运行。

假设有 5 个案例。

Case.find({},{case_id:1}).then(recs=>{
     recs.forEach(function(rec){
         console.log("x");
         CustomerAgreement.findOne({case_id:rec.case_id}).then(t=>{
             console.log("y");
         });
     });

     console.log("z");
});

我得到的结果是(假设有 5 个案例) X X X X X z 是的 是的 是的 是的 是的

我想要的结果是 X 是的 X 是的 X 是的 X 是的 X 是的 z

【问题讨论】:

    标签: node.js asynchronous mongoose foreach


    【解决方案1】:

    如果你能够使用 async / await 你可以使用 for of 循环

    const recs = await Case.find({}, {case_id: 1});
    
    for (const rec of recs) {
      console.log("x");
    
      const t = await CustomerAgreement.findOne({ case_id: rec.case_id }).exec();
      console.log("y");
    }
    
    console.log("z");
    

    如果没有,您可以使用async,这是一个允许您执行此类操作的库。

    Case.find({}, { case_id: 1 }).then((recs) => {
      async.each(recs, (rec, callback) => {
        console.log("x");
        CustomerAgreement.findOne({ case_id : rec.case_id }).then((t) => {
          console.log("y");
          callback();
        });
      }, (err) => {
        if (err) {
          console.log(err);
        } else {
          console.log('all records found successfully');
          console.log("z");
        }
      });
    });
    

    PD:我没有测试上面的代码,但理论上应该可以工作。

    【讨论】:

    • 这仍然不起作用。它首先在 for 循环中打印所有“X”,然后在 CustomerAgreement.findOne 中打印“Y”。我需要的是,在第一个循环运行的那一刻,我希望 CustomerAgreement.findOne 与它一起运行。现在发生的是循环第一次完成,然后 CustomerAgreement.findOne 完成。
    【解决方案2】:

    您可以在循环中使用 async 函数和 await 每个查询:

    Case
      .find({}, { case_id: 1 })
      .then(async (recs) => {
    
        for (const rec of recs) {
          console.log("x");
    
          const t = await CustomerAgreement
            .findOne({ case_id: rec.case_id })
            .exec();
    
          console.log("y");
        }
    
        console.log("z");
      });
    

    我希望这会有所帮助。

    【讨论】:

    • 如何读取 const t 变量?当我执行 console.log(t) 时,它显示 [object Object]
    • 尝试添加 exec.findOne({ ... }).exec()
    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2021-04-08
    • 2015-09-01
    • 2017-12-18
    • 2017-03-16
    相关资源
    最近更新 更多