MongoDB计算不同的项目

时间:2019-08-25 05:02:10

标签: mongodb nosql aggregation-framework aggregate

我对具有以下字段的列表进行以下查询:键,时间,p,电子邮件

use app_db;
db.getCollection("app_log").aggregate(
    [
        { 
            "$match" : {
                "key" : "login"
            }
        }, 
        { 
            "$group" : {
                "_id" : {
                    "$substr" : [
                        "$time", 
                        0.0, 
                        10.0
                    ]
                }, 
                "total" : {
                    "$sum" : "$p"
                }, 
                "count" : {
                    "$sum" : 1.0
                }
            }
        }
    ]
);

和输出是这样的:

{ 
    "_id" : "2019-08-25", 
    "total" : NumberInt(623), 
    "count" : 400.0
}
{ 
    "_id" : "2019-08-24", 
    "total" : NumberInt(2195), 
    "count" : 1963.0
}
{ 
    "_id" : "2019-08-23", 
    "total" : NumberInt(1294), 
    "count" : 1706.0
}
{ 
    "_id" : "2019-08-22", 
    "total" : NumberInt(53), 
    "count" : 1302.0
}

但是我需要 count 在电子邮件字段上与众不同,这是每天登录且p值大于0的不同电子邮件地址的数量 < / p>

1 个答案:

答案 0 :(得分:1)

您需要$addToSet才能每天获取一组唯一的电子邮件值,然后可以使用$size来计算该数组中的项目数:

db.getCollection("app_log").aggregate(
    [
        { 
            "$match" : {
                "key" : "login"
            }
        }, 
        { 
            "$group" : {
                "_id" : {
                    "$substr" : [
                        "$time", 
                        0.0, 
                        10.0
                    ]
                }, 
                "total" : {
                    "$sum" : "$p"
                }, 
                "emails" : {
                    "$addToSet": "$email"
                }
            }
        },
        {
            $project: {
                _id: 1,
                total: 1,
                countDistinct: { $size: "$emails" }
            }
        }
    ]
);