在同一mongodb查询中选择Group by count和distinct count

在同一mongodb查询中选择Group by count和distinct count,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我正在尝试做一些类似的事情 select campaign_id,campaign_name,count(subscriber_id),count(distinct subscriber_id) group by campaign_id,campaign_name from campaigns; 此查询提供除计数外的结果(不同的订户id) 以下查询提供除count(订户id)之外的结果 但是我想要相同结果中的count(订户id)、count(不同订户id) 当你朝着正确的方向前进时,你开始沿

我正在尝试做一些类似的事情

select campaign_id,campaign_name,count(subscriber_id),count(distinct subscriber_id)
group by campaign_id,campaign_name from campaigns;
此查询提供除计数外的结果(不同的订户id)

以下查询提供除count(订户id)之外的结果

但是我想要相同结果中的count(订户id)、count(不同订户id)

当你朝着正确的方向前进时,你开始沿着正确的路线思考。改变您的SQL思维,“独特”实际上只是用这两种语言编写操作的另一种方式。这意味着您在这里有两个组操作,在聚合管道术语中,有两个管道阶段

只需使用简化的文档即可可视化:

{
“活动id”:“A”,
“活动名称”:“A”,
“订户id”:“123”
},
{
“活动id”:“A”,
“活动名称”:“A”,
“订户id”:“123”
},
{
“活动id”:“A”,
“活动名称”:“A”,
“订户id”:“456”
}
显然,对于给定的“活动”组合,总计数和“不同”计数分别为“3”和“2”。因此,合乎逻辑的做法是首先“分组”所有这些“订户id”值,并保留每个值的出现次数,然后在考虑“管道”时,“合计”每个“活动”的出现次数,然后将“不同”的出现次数作为一个单独的数字进行计数:

db.campetings.aggregate([
{“$match”:{“订户id”:{“$ne”:null}},
//统计所有事件
{“$组”:{
“_id”:{
“活动id”:“$campaign\u id”,
“活动名称”:“$campaign\u name”,
“订户id”:“$subscriber\u id”
},
“计数”:{“$sum”:1}
}},
//对所有发生的事件求和并计数
{“$组”:{
“_id”:{
“活动id”:“$\u id.活动id”,
“活动名称”:“$\ id.活动名称”
},
“totalCount”:{“$sum”:“$count”},
“distinctCount”:{“$sum”:1}
}}
])
在第一个“组”之后,输出文档可以如下所示:

db.TransactionDetails.aggregate([ 
{$group:{_id:{"CITY" : "$cityName"},uniqueCount: {$addToSet: "$emailId"}}},
{$project:{"CITY":1,uniqueCustomerCount:{$size:"$uniqueCount"}} } 
]);
{
“_id”:{
“活动id”:“A”,
“活动名称”:“A”,
“订户id”:“456”
}, 
“计数”:1
}
{ 
“_id”:{
“活动id”:“A”,
“活动名称”:“A”,
“订户id”:“123”
}, 
“计数”:2
}
因此,从样本中的“三个”文档中,“2”属于一个不同的值,“1”属于另一个值。这仍然可以进行合计,以获得您在下一阶段中所做的全部匹配文档,最终结果如下:

{
“_id”:{
“活动id”:“A”,
“活动名称”:“A”
},
“总数”:3,
“distinctCount”:2
}
聚合管道的一个非常好的类比是unix管道“|”操作符,它允许操作的“链接”,以便您可以将一个命令的输出传递到下一个命令的输入,依此类推。开始以这种方式考虑您的处理需求将有助于您更好地理解聚合管道的操作。

SQL查询:(group by&count OFDISTINCT)

等效的mongo查询如下所示:

db.TransactionDetails.aggregate([ 
{$group:{_id:{"CITY" : "$cityName"},uniqueCount: {$addToSet: "$emailId"}}},
{$project:{"CITY":1,uniqueCustomerCount:{$size:"$uniqueCount"}} } 
]);

是的,我使用聚合已经有一段时间了,直到现在我才明白。我只是完全避免了管道方面的复杂性,因为mongoDB的文档在这方面非常混乱,需要您的示例!
select city,count(distinct(emailId)) from TransactionDetails group by city;
db.TransactionDetails.aggregate([ 
{$group:{_id:{"CITY" : "$cityName"},uniqueCount: {$addToSet: "$emailId"}}},
{$project:{"CITY":1,uniqueCustomerCount:{$size:"$uniqueCount"}} } 
]);