如何在 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的主要内容,如果未能解决你的问题,请参考以下文章
将 2 列中的 json 数据与模式中的数据进行比较,并将最新数据覆盖为 mongoos 中的主要数据