如何在Foreach中同步运行猫鼬查找

时间:2019-04-19 05:51:01

标签: node.js asynchronous mongoose foreach

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

让我们说有5个案例。

.inbtn{
         height: 30px;
        width: 30px;
        display: inline-block;
        border-radius: 50%;
        font-size: large;
        font-weight: 500;
        margin-left: 25%;
        margin-right:25%;
        vertical-align: middle;
        background-color:  #d8d8d8 !important;
        text-align: center;
      -webkit-appearance: none;
        }

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

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

2 个答案:

答案 0 :(得分:0)

您可以在循环中使用 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");
  });

我希望这会有所帮助。

答案 1 :(得分:0)

如果您可以使用异步/等待,则可以使用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:我没有测试上面的代码,但是从理论上讲应该可以。