【MongoDB日常记录】group后求count(distinct 某字段) 的方法

今天,我遇到了个在mongo中 group后 count(distinct f1) 的需求。 备注:f1 代表某字段

大意是: 根据key1 分组后,找出该组中字段 f1的不重复数量

1. mysql实现

  • 伪sql如下:(这个挺简单的)
select key1, count(distinct f1) from t group by key1
复制代码

2. mongo如何实现呢?

  • mongo实现如下:
db.t.aggregate([
    {$match: {
        createTime: { $gte: 1, $lt: 8888888888888888 }
     }},
    {
        '$group': {
            "_id": {'key1':'$key1'},
            f1DistinctCount:{$addToSet:"$f1"},
            successCount: {
                $sum: {
                    $cond: [
                        {
                            $and: [
                                { $eq: ['$successOrFail', 1] }]
                        },
                        1,
                        0
                    ]
                }
            },
            failCount: {
                $sum: {
                    $cond: [
                        {$and: [
                              { $eq: ['$successOrFail', 0] }]
                        },
                        1,
                        0
                    ]

                }
            }
        },

    },
    {
        '$project': {
            '_id': 1, 'key1':1,'successCount': 1, 'failCount': 1,'f1DistinctCount':1
        }
    }
],{allowDiskUse: true});
复制代码

f1DistinctCount是一个set集合 如果你使用mongotemplate的话 他是个 com.mongodb.BasicDBList 集合,取出集合的长度即得到我想要的结果了

当然如果你有更好的方式,欢迎交流讨论一起学习。

猜你喜欢

转载自juejin.im/post/7078541935190736903