在mongodb中的另一个集合的foreignField上使用$Group进行分组

在mongodb中的另一个集合的foreignField上使用$Group进行分组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,这是我的疑问: db.getCollection('_build').aggregate([ { $group:{ _id: "$ProjectId", Builds: {$addToSet: "$_id"} } }, { $lookup:{ from: "_build.detail", localField: "Builds",

这是我的疑问:

db.getCollection('_build').aggregate([
    {
        $group:{
            _id: "$ProjectId",
            Builds: {$addToSet: "$_id"}
        }
    },
    {
        $lookup:{
            from: "_build.detail",
            localField: "Builds",
            foreignField: "BuildId",
            as: "result"
        }
    },
    {
        $project:{
            _id:0,
            ProjectId: "$_id",
            Builds: 1,
            BuildCountForProject: {$size: "$Builds"}
        }
    }

]);
查询结果:

/* 1 */
{
    "Builds" : [ 
        ObjectId("58f908411f19cf1d340974c2"), 
        ObjectId("58f902bd1f19cf1d3409749d")
    ],
    "ProjectId" : ObjectId("58f7a38f1f19cf38306a1b9c"),
    "BuildCountForProject" : 11
}

/* 2 */
{
    "Builds" : [ 
        ObjectId("58f797631091c228bc3af071"), 
        ObjectId("58f79fa31091c528bc4ff8f1"), 
        ObjectId("58f769441f19cf22dc92da24"), 
        ObjectId("58f633801f19cf4f8073b203")
    ],
    "ProjectId" : ObjectId("58e27c921091c22e34243db7"),
    "BuildCountForProject" : 4
}
我在查询结果中获取每个项目的构建数组,我想在每个项目的构建的基础上使用相同的查询查询另一个集合,我想聚合一些数据数据必须按ProjectId分组,我想加入的集合中没有ProjectId,但正如你们在结果中看到的,我已经准备好了

例如:

我想找出这些产品的广告、广告和广告的数量

目标58F908411F19CF1D340974C2 目标58F902BD1F19CF1D3409749D 如结果所示,这两个构建都属于项目对象58F7A38F1F19CF38306A1B9C

想要像这样的输出

{
    "ProjetId" : ObjectId("58f7a38f1f19cf38306a1b9c"),
    "BuildId" :[ ObjectId("58f908411f19cf1d340974c2"), 
                ObjectId("58f902bd1f19cf1d3409749d")]
    "UniqueAdsCount" : 10,
    "UniqueAdsetCount": 5,
    "UniqueCampaignCount": 2 
},
{
    next ProjectId,
    Builds array,
    UniqueAdsCount
    UniqueAdsetCount
    UniqueCampaignCount
},...
我想与_build.detials一起加入的集合:

{
    "_id" : ObjectId("58de834cc6e7dbe945acf890"),
    "BuildId" : ObjectId("58ef4b95c6e7dbe945ba700b"),
    "Values" : null,
    "Headers" : null,
    "Data" : {
        "Campaign Name" : "Remarketing | Remarketing | Facebook | Conversions | 03-01-2017",
        "Ad Set Name" : "Cancelled Orders_Greater than 50%-Cancelled Orders_Less than 50% | Desktop | Feed | Female | 21-65",
        "Ad Name" : "Carousel | Draw1,Excited2,Lottery5,Beach4 | S:1814082498827964 | 03-01-2017 | 70Custom Audiences | ",
        "Ad Set Run Status" : "ACTIVE",
        "Ad Status" : "ACTIVE",
        "Campaign Objective" : "Conversions",
        "Gender" : "Female",
        "Age Min" : "21",
        "Age Max" : "65",

    },
    "Status" : false,
    "CampaignName" : "Remarketing | Remarketing | Facebook | Conversions | 03-01-2017",
    "AdSetName" : "Cancelled Orders_Greater than 50%-Cancelled Orders_Less than 50% | Desktop | Feed | Female | 21-65",
    "AdName" : "Carousel | Draw1,Excited2,Lottery5,Beach4 | S:1814082498827964 | 03-01-2017 | 70Custom Audiences | ",
    "Campaign_Status" : 1,
    "Campaign_Id" : "1",
    "Adset_Status" : 1,
    "Adset_Id" : "123",
    "Ad_Status" : 1,
    "Ad_Id" : "1234"
},...

您可以尝试下面的查询。这与我们这里的查询类似

下面的查询将$lookup转换为build details以获取所有字段,并$group一次一个字段以获取不同的值,后面跟着$project以计算每个生成的不同值

最后一个$group是将所有构建推送到一个数组中,同时将所有构建细节计数相加

   aggregate([
      { $group: {_id: "$ProjectId",Builds: {$addToSet: "$_id"}}},
      { $lookup: {from: "_build.detail",localField: "Builds",foreignField: "BuildId",as: "result"}},
      { $unwind: "$result"},
      {
        $group: 
         {
           _id: 
            {
              ProjectId: "$_id",
              BuildId: "$result.BuildId",
              campaignName: "$result.Data.Campaign Name",
              adSet: "$result.Data.Ad Set Name"
            },
            uniqueAdNames: {$addToSet: "$result.Data.Ad Name"}
          }
      },
      { $addFields: {uniqueAdsCount: {$size: "$uniqueAdNames"}}},
      {
        $group: 
          {
            _id: 
              {
                ProjectId: "$_id.ProjectId",
                BuildId: "$_id.BuildId",
                campaignName: "$_id.campaignName"
              },
              uniqueAdsCount: {$first: "$uniqueAdsCount"},
              uniqueAdSets: {$addToSet: "$_id.adSet"}
          }
      },
      { $addFields: {uniqueAdsetCount: {$size: "$uniqueAdSets"}}},
      {
        $group: 
          {
            _id:{ProjectId: "$_id.ProjectId", BuildId: "$_id.BuildId"},
            uniqueAdsCount: {$first: "$uniqueAdsCount"},
            uniqueAdsetCount: {$first: "$uniqueAdsetCount"},
            uniqueCampaignNames: {$addToSet: "$_id.campaignName"}
          }
      },
      { $addFields: {uniqueCampaignCount: {$size: "$uniqueCampaignCount"}}},
      {
        $group: 
         {
           _id: "$projectId",
           Builds: {$push: "$_id.BuildId"},
           uniqueAdsCount: {$sum: "$uniqueAdsCount"},
           uniqueAdsetCount: {$sum: "$uniqueAdsetCount"},
           uniqueCampaignCount: {$sum: "$uniqueCampaignCount"}
          }
      },
      {
        $project:
         {
           _id: 0,
           ProjectId: "$_id.ProjectId",
           Builds: 1,
           BuildCountForProject: {$size: "$Builds"},
           uniqueAdsCount: 1,
           uniqueAdsetCount: 1,
           uniqueCampaignCount: 1,
         }
      }
   ])

谢谢veeram,终于找到了我想要的东西。这是一个很好的逻辑,您可以在每个阶段中对父元素进行分组,一次找到一个子元素的数量,然后继续使用$first将它们带到最后一个阶段。这简直太棒了。