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

6
我有一个数据集,看起来像这样:
{"BrandId":"a","SessionId":100,"UserName":"tom"}
{"BrandId":"a","SessionId":200,"UserName":"tom"}
{"BrandId":"b","SessionId":300,"UserName":"mike"}

我希望能够按照品牌ID对会话和用户名进行去重统计,示例SQL如下:
select brandid,count_distinct(sessionid),count_distinct(username)
from data
group by brandid

我尝试编写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"}
    }}
])

对于这个特定的例子,预期计数为

{"BrandId:"a","countSession":2,"countUser":1}
{"BrandId:"b","countSession":1,"countUser":1}

如果您熟悉SQL,那么期望的结果与我提到的SQL相同。

@JohnnyHK 不是的。肯定不是这个问题。如果你知道如何计算多个字段,请告诉我。 - erkpwejropi
1
期望/预期的输出是什么? - chridam
@chridam 我在问题中添加了期望的输出,请帮忙。 - erkpwejropi
1个回答

5
您可以使用$addToSet操作符在$group阶段期间累积不同的SessionIdUserName值的集合,然后在管道中添加一个$project阶段,使用$size操作符获取每个集合的大小。请保留HTML标记,并改写内容以使其更加通俗易懂。
db.logs.aggregate([
    {$group: {
        _id: '$BrandId', 
        sessionIds: {$addToSet: '$SessionId'}, 
        userNames: {$addToSet: '$UserName'}
    }},
    {$project: {
        _id: 0, 
        BrandId: '$_id', 
        countSession: {$size: '$sessionIds'}, 
        countUser: {$size: '$userNames'}
    }}
])

结果:

{
    "BrandId" : "b",
    "countSession" : 1,
    "countUser" : 1
}, 
{
    "BrandId" : "a",
    "countSession" : 2,
    "countUser" : 1
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接