错误的方法
我们要获取唯一的电子邮箱,使用到 distinct
, 例如
db.user_info.distinct('email')
得到的是一个列表:
[
"123@gmail.com",
"456@gmail.com",
"567@gmail.com",
"890@aol.com"
]
然后获取长度
db.user_info.distinct('email').length
设想一下,我们如果有15,000,000记录,我们要生成一个庞大的列表,然后仅仅是获取一个总数,我们值得这样做吗?
正确的方法
使用MongoDB的aggregate
语法:
db.集合名称.aggregate({管道:{表达式}}, {管道:{表达式}}...)
db.collection.aggregate(pipeline, options)
$group:将集合中的文档分组,可用于统计结果
$sum: 1 满足一条就加1, 也就是count是 group中 每个email的数量
先分组,然后再从分组中计算总数。
db.user_info.aggregate(
{
$group: {
_id: '$email'
}
},
{
$group: {
_id: 1,
count: {
$sum: 1
}
}
}
)