Mongo查询去重后的总数

Mongo里现有一批数据,大致结构如下:

{"userId":1,"loginTime":ISODate("2017-11-28T10:47:57.525+08:00")}
{"userId":2,"loginTime":ISODate("2017-11-28T11:47:57.525+08:00")}
{"userId":1,"loginTime":ISODate("2017-11-28T12:47:57.525+08:00")}
{"userId":3,"loginTime":ISODate("2017-11-28T13:47:57.525+08:00")}

要按userId字段去重后统计总数,示例数据返回结果应该是:3,在SHELL中可以使用

db.logins.distinct("userId").length

来查询,但在spring-data-mongo中使用MongoTemplate怎样实现相同功能,注意不能使用distinct把结果都查出来后取size,实际的数量级可能比较大,如千万级别。

另外听说Mongodistinct结果集不能超过16MB(不确定),那么上面SHELL中的用法应该也会有问题。

整个需求可以简单描述为:查询每日登录人数(注意不是人次)

阅读 16.6k
4 个回答

浏览好多文档博客,都找不到舒服点的答案。不过最终还是找到了,在这里记录一下:

db.coll.aggregate(
    {$group: {_id: "$key1.key_to_distinct"}},
    {$group: {_id: 1, count: {$sum: 1}}}
)

原理是,先使用第一个分组对指定键上的所有值去重,然后使用第二个分组统计这些值。

原参考文档:http://www.forwardadvance.com...

Aggregation count = Aggregation.newAggregation(  
        Aggregation.group("userId"),  
        Aggregation.count().as("totalCount")  
);

mongoTemplate.aggregate(count, MessagePO.class, Map.class);

本人测试过一些用法,但都不能满足上述需求:

// 实际返回一个List,这样计算总数肯定不合算
mongoTemplate.getCollection(collectionName).distinct("userId")

今天,我遇到了类似的需求

大意是: 根据key1 分组后,找出该组中字段 f1的不重复数量
伪sql:select key1, count(distinct f1) from t group by key1

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});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏