如何在 Foreach 中同步运行 Mongoose Find

Posted

技术标签:

【中文标题】如何在 Foreach 中同步运行 Mongoose Find【英文标题】:How to Run a Mongoose Find inside a Foreach synchronously 【发布时间】: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

【问题讨论】:

【参考方案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()

以上是关于如何在 Foreach 中同步运行 Mongoose Find的主要内容,如果未能解决你的问题,请参考以下文章

如何在以下 lambda exp 中添加同步?

如何在 forEach 中运行 useQuery?

将 2 列中的 json 数据与模式中的数据进行比较,并将最新数据覆盖为 mongoos 中的主要数据

异步每个 vs forEach js

(JavaScript) 将 forEach 循环与内部回调同步

如何在 foreach 循环内的 laravel 刀片文件中运行不同的 SELECT 查询?