使用 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 慢得多

async-await 同时触发(等待)多个异步操作

Callback Promise Generator Async-Await 和异常处理的演进

函数真的需要返回 promise 才能使 async-await 工作吗?

Promise/async-await with mongoose,返回空数组

async-await