使用Mongo按组计算多个不同的字段

erk*_*opi 5 mongodb aggregation-framework

我的数据集看起来像

{"BrandId":"a","SessionId":100,"UserName":"tom"}
{"BrandId":"a","SessionId":200,"UserName":"tom"}
{"BrandId":"b","SessionId":300,"UserName":"mike"}
Run Code Online (Sandbox Code Playgroud)

我想用brandid计算不同的会话和用户名组,示例sql如下:

select brandid,count_distinct(sessionid),count_distinct(username)
from data
group by brandid
Run Code Online (Sandbox Code Playgroud)

我试着编写Mongo DB,我当前的代码如下,它不起作用.反正有没有让它工作?

db.logs.aggregate([ 
    {$group:{
        _id:{brand:"$BrandId",user:"$UserName",session:"$SessionId"},  
        count:{$sum:1}}}, 
    {$group:{
        _id:"$_id.brand",
        users:{$sum:"$_id.user"},
        sessions:{$sum:"$_id.session"}
    }}
])
Run Code Online (Sandbox Code Playgroud)

对于某个例子,预期的数量是

{"BrandId:"a","countSession":2,"countUser":1}
{"BrandId:"b","countSession":1,"countUser":1}
Run Code Online (Sandbox Code Playgroud)

如果您了解SQL,则期望结果与我提到的SQL相同.

Joh*_*yHK 5

您可以通过使用$addToSet在 期间累积不同的SessionIdUserName值集$group,然后将一个$project阶段添加到您的管道中,该阶段使用$size运算符来获取每个集合的大小:

db.logs.aggregate([
    {$group: {
        _id: '$BrandId', 
        sessionIds: {$addToSet: '$SessionId'}, 
        userNames: {$addToSet: '$UserName'}
    }},
    {$project: {
        _id: 0, 
        BrandId: '$_id', 
        countSession: {$size: '$sessionIds'}, 
        countUser: {$size: '$userNames'}
    }}
])
Run Code Online (Sandbox Code Playgroud)

结果:

{
    "BrandId" : "b",
    "countSession" : 1,
    "countUser" : 1
}, 
{
    "BrandId" : "a",
    "countSession" : 2,
    "countUser" : 1
}
Run Code Online (Sandbox Code Playgroud)