【问题标题】:Join multiple collections using Aggregations with conditions使用带有条件的聚合连接多个集合
【发布时间】:2021-07-06 05:03:21
【问题描述】:

我有 3 个这样的收藏

  ModelA : 

  {
      _id :ObjectId("60d2cd964200b320e7dc5c04"),
      name : 'Item 1'
  }


  ModelB : 

  {
      _id :ObjectId("60e3c8e0748d2a18476ceb6f"),
      modelA : ObjectId("60d2cd964200b320e7dc5c04"),
      field1 : 'field1 item A',
      field2 : 'field2 item B',
  }


  ModelC : 

  {
      _id :ObjectId("60e3c8e0748d2a18476ceb70"),
      modelB : ObjectId("60e3c8e0748d2a18476ceb6f"),
      status : 'finish'
  }

我想获取 ModelA 名称为“项目 1”且 ModelC 状态等于“完成”的所有这些集合的数据, 如何使用聚合加入这 3 个集合?

【问题讨论】:

  • 您可以使用聚合$lookup 阶段查询来加入多个集合。
  • @prasad_ 我知道我尝试过使用它,问题是我不知道如何加入 3 个集合。
  • 首先,您加入两个集合。然后在生成的数据集上与第三个集合进行另一次联接。请随时在网上搜索更多示例(“mongodb 如何加入三个集合”)。这是一个这样的例子:stackoverflow.com/questions/40789057/…
  • 感谢回复,我知道我们可以使用多个 $lookup,在我的情况下,如果 ModelC foreignField 是 Model B _id,我们如何加入。我也知道我们可以先加入两个集合,但我想知道是否只有一个查询的解决方案。

标签: javascript mongodb aggregation-framework


【解决方案1】:

您可以放置​​多个$lookup 阶段来加入多个集合,因此您可以使用这样的查询:

db.ModelA.aggregate([
   {
      $lookup:{
         from:"ModelB",
         localField:"_id",
         foreignField:"modelA",
         as:"modelB"
      }
   },
   {
      $unwind:"$modelB"
   },
   {
      $lookup:{
         from:"modelC",
         localField:"ModelB._id",
         foreignField:"modelB",
         as:"modelC"
      }
   },
   {
      $unwind:"$modelC"
   },
   {
      $match: {
         name: "Item 1",
         "modelC.status": "finish"
      }
   },
   { // disable this stage if you want to get all fields of 3 collections or modify it with the output that you want
      $project:{
         "name": 1,
         "status": "$modelC.status"
      }
   }
]);

【讨论】:

  • 感谢回复,对于 ModelA 名称为“项目 1”且 ModelC 状态为“完成”的匹配,我们该怎么做?
  • 您可以通过在查询中添加阶段match 来将文档匹配到您想要的条件。我刚刚再次更新了我的答案。希望对你有帮助
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 2015-01-08
  • 2023-03-28
  • 2014-09-07
  • 2014-12-12
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
相关资源
最近更新 更多