使用 promise 和 async-await 映射来自其他表的嵌套数据
Posted
技术标签:
【中文标题】使用 promise 和 async-await 映射来自其他表的嵌套数据【英文标题】:Map the nested data from other table using promise and async-await 【发布时间】:2021-12-15 23:59:27 【问题描述】:我需要有关此代码的专家建议。我需要知道有没有更好的方法来解决这个问题。
我正在使用 mongoose 进行数据库。我有一个这样的数据集:
下面是匹配表:
_id: 617bc0113176d717f4ddd6ce,
car: [],
status: true
,
_id: 617bc0113176d717f4ddd6cg,
car: [
aid: '5c1b4ffd18e2d84b7d6febcg',
],
status: true
我有一个 Car 表,其中汽车名称代表 id 像这样
_id: ObjectId('5c1b4ffd18e2d84b7d6febce'), name: 'ford' ,
_id: ObjectId('5c1b4ffd18e2d84b7d6febcg'), name: 'mitsubishi' ,
所以我想加入汽车表中的数据,以便响应获得代表援助的名称。 想要的结果会是这样的
_id: 617bc0113176d717f4ddd6ce,
car: [],
status: true
,
_id: 617bc0113176d717f4ddd6cg,
car: [
aid: '5c1b4ffd18e2d84b7d6febcg',
name: 'mitsubishi'
],
status: true
为此,我必须在 matchTable 上合并汽车表。我已经这样做了,但我想提出一些建议,即有没有更好的方法或者可以。我需要专家建议。
const getData = await matchTable.find(
status: true
).lean().exec();
let dataHolder = [];
await Promise.all (
getData.map(async x =>
await Promise.all(
x.car.map(async y =>
let data = await Car.findOne(
_id: ObjectId(y.aid) ,
name: 1
).lean().exec();
y.name = '';
if (data)
y.name = data.name;
)
)
// If I return ...x , then on response it will return , on car column
dataHolder.push(x) //So I have chosen this approach
)
);
如果有更好更有效的解决方案,请指导我。提前致谢
【问题讨论】:
您不能在同步 Array 方法(.map()
、.forEach()
、.filter()
等)中使用 await
。如果你想等待,你必须使用 for
循环。
【参考方案1】:
您可以在这里使用聚合。
const pipeline = [
$match : status : true
,
$unwind: '$matchtable',
,
$lookup:
from: "cars",
localField: "car.aid",
foreignField: "_id",
as: "matchcars"
,
$addFields:
"car.carName": $arrayElemAt: ["$matchcars.name", 0]
,
$group:
_id: "$_id",
cars: $push: "$matchcars"
]
const result = await matchTable.aggregate(pipeline).exec();
请确保 car 数组(在 matchTable 集合中)内的 aid
字段是 ObjectId,因为它与 cars
集合内的 _id
(这是一个 ObjectId)匹配。
【讨论】:
我已经完成但仍然得到空数组响应 它在本地为我工作,对于给定的模式。如果有的话,你能分享你的可公开访问的回购吗?以上是关于使用 promise 和 async-await 映射来自其他表的嵌套数据的主要内容,如果未能解决你的问题,请参考以下文章
为啥一起运行时 async-await 比 Promise 慢得多
Callback Promise Generator Async-Await 和异常处理的演进
函数真的需要返回 promise 才能使 async-await 工作吗?