mongodb如何在aggregate中进行distinct操作

Apr 19, 2018   mongodb  distinct  aggregate 

mongodb如何在aggregate中进行distinct操作

mongodb 在聚合操作中,经常需要同传统的sql一样,进行诸如 sum(distinct) ,group by having 操作,那么等价的mongodb是啥呢?

场景描述

现在需要用mongodb来记录业务员的外呼记录,使用三个表,结构分别如下:(实际情况可能有出入,抽出主要的字段说明)

  • 业务员 admin_user
字段 类型 含义及说明
id int 业务员id
name string 姓名
  • 客户表 user
字段 类型 含义及说明
uid int 客户id
name string 姓名
  • 关联表 call_log
字段 类型 含义及说明
auid int 业务员id
uid int 客户id
ctime int 呼叫时间

那么问题来了,如何找出具体某一天的业务员呼叫的客户数量?

这时候,如果简单的用mysql来处理,简单的一条sql就行了:

SELECT auid,COUNT(DISTINCT uid) AS call_count FROM call_log WHERE ctime >=<时间戳> AND ctime <= <时间戳> GROUP BY auid

但是用mongodb来处理,我找了半天,也没发现有distinct对等的函数,从stackoverflow上找到了答案,思路就是分两次组,第一次按auid,uid,第二次按auid,这样就会去重(一天可以呼叫同一个业务员多次)

代码如下:


db.campaigns.aggregate([
    { "$match": { "ctime": { "$gte": <时间戳>,"$lte":<时间戳> }}},
    { "$group": {
        "_id": {
            "auid": "$auid",
            "uid": "$uid"
        },
        "count": { "$sum": 1 }
    }},
    { "$group": {
        "_id": '$_id.auid',
        "count": { "$sum": 1 }
    }}
])


 参考链接

- mongodb group distinct