【问题标题】:count multiple distinct fields by group with Mongo使用 Mongo 按组计算多个不同的字段
【发布时间】:2015-05-06 19:40:32
【问题描述】:

我有一个数据集看起来像

{"BrandId":"a","SessionId":100,"UserName":"tom"}
{"BrandId":"a","SessionId":200,"UserName":"tom"}
{"BrandId":"b","SessionId":300,"UserName":"mike"}

我想按brandid计算不同的会话和用户名组,示例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 没有。定义它不是问题。如果您知道如何计算多个字段,请告诉我。
  • 预期/期望的输出是什么?
  • @chridam 我将预期的输出添加到问题中。请帮忙

标签: mongodb aggregation-framework


【解决方案1】:

您可以使用$addToSet$group 期间累积不同的SessionIdUserName 值集,然后将$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'}
    }}
])

结果:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多