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

阿卜杜勒·莫伊兹

这是我的查询:

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
}

我在查询结果中获取针对每个项目的 Builds 数组,我想根据每个项目中的 Builds 查询另一个集合(使用相同的查询),想要聚合一些数据(数据必须按 ProjectId 分组) ,我想加入的集合中没有 ProjectId,但正如您在结果中看到的那样,我有它在管道中)。

例子:

我想找到这些构建的广告、广告集、广告系列的不同计数,

  1. ObjectId("58f908411f19cf1d340974c2")
  2. ObjectId("58f902bd1f19cf1d3409749d")

如结果所示,这两个构建都属于项目 ObjectId("58f7a38f1f19cf38306a1b9c")。

想要输出,

{
    "ProjetId" : ObjectId("58f7a38f1f19cf38306a1b9c"),
    "BuildId" :[ ObjectId("58f908411f19cf1d340974c2"), 
                ObjectId("58f902bd1f19cf1d3409749d")]
    "UniqueAdsCount" : 10,
    "UniqueAdsetCount": 5,
    "UniqueCampaignCount": 2 
},
{
    next ProjectId,
    Builds array,
    UniqueAdsCount
    UniqueAdsetCount
    UniqueCampaignCount
},...

我想加入 with_build.details 的集合:

{
    "_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"
},...
s7vr

您可以尝试以下查询。它类似于我们在这里的查询Using multiple $lookup with Aggregation in mongodb

下面的查询将$lookup进入build details到让所有的领域,$group他们一次一个为不同的值,然后$project计算不同值的每个版本。

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

   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,
         }
      }
   ])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

需要对使用mongodb聚合查询从另一个集合连接的多个字段进行不同的计数

MongoDB通过嵌套字段进行分组并按另一个字段进行计数

如何基于mongodb中的另一个数组值对数组进行分组

使用mongoose nodejs在另一个集合mongoDB中填充集合

如何使用mongodb合并两个集合结果和另一个集合

使用另一个列表中的字符串在列表列表中对元素进行分组

计算在MongoDB中另一个字段上分组的文档中某个字段中的字符串实例数吗?

如何使用另一个集合中的信息过滤MongoDB集合?

使用聚合管道在MongoDB中将一个集合中的功能添加到另一个中

如何计算具有相同值的文档数,并使用mongoDB中的另一个字段将它们分组?

在Dataframe中对列进行分组,并使用分组的数据创建另一个数据框

如何使用MongoDB或Mongoose在一个查询中对两个集合进行分组

mongodb-根据使用量计数从一个集合中获取顶级项目,作为另一个集合中的字段

使用基于另一个属性值的嵌套路径进行Mongodb查询

根据另一个集合中的ID对mongodb集合项进行排名

如何在另一个PowerPoint.Slide上对许多形状进行分组

如何对MongoDB集合中的对象进行分组

Mongodb将一个集合复制到另一个集合中

在MongoDB中,如何在find()中使用等效于$ out的运算符将数据复制到另一个集合中?

使用 MongoDB 中的聚合框架进行分组和计数

在 UNION ALL 上使用 GROUP BY 时未对结果进行分组

MongoDB:基于另一个集合从一个集合中进行条件选择

以时间间隔对年龄进行分组以使用 r 中的另一个变量创建列联表

使用 Lodash 对另一个对象中的特定值进行分组

使用 JavaScript 按另一个数组对数组进行分组

如何使用同一数据库中另一个集合的数据创建 mongoDB 集合

MongoDB 使用另一个集合中的另一个字段更新字段

如何使用mongodb中主集合的objectID在另一个集合中查找

您如何使用 MongoDB $lookup 返回子字符串,然后使用该子字符串检查另一个集合中的内容