在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将它们带到最后一个阶段。这简直太棒了。