将信息收集汇总,进行统计操作,这样子的操作就称为聚合。
统计表里面的数据量
db.students.count();
消除重复数据可以使用distinct ------ 没有现成的函数,只能用底层的函数runCommand
db.runCommand({"distinct":"students","key":"name"})
使用底层的runCommand方法实现group的方法
db.runCommand({"group":{
"ns":"students",
"key":{"age":true},
"initial":{"count":0},
"condition":{"age":{"$gte":19}},
"$reduce":function(doc,prev){
prev.count++;
}
}})
MapReduce是整个大数据的核心,实际的过程中会用聚合函数代替
Map:将整个数据分别去出来,
Reduce:负责数据的最后的处理。
var jobMapFun = function(){
emit(this.job,this.name)
}
var jobReduceFun = function(key,values){
return {"job":key,"names":values}
}
db.runCommand({
"mapreduce" : "emps", //处理的集合
"map":jobMapFun,
"reduce":jobReduceFun,
"out":"t_job_emps" //输出结果集合
})
运行上述的代码,得到一个集合t_job_emps
如果需要对reduce处理完后的数据进行处理还可以加上一个finalize
var jobFinalizeFun= function(key,values){
if (key == "president"){
return {"job":key,"names":values,"info":"boss"}
}else{
return {"job":key,"names":values}
}
}
db.runCommand({
"mapreduce" : "emps", //处理的集合
"map":jobMapFun,
"reduce":jobReduceFun,
"finalize":jobFinalizeFun,
"out":"t_job_emps" //输出结果集合
})
运行上述代码得到结果
聚合函数aggregate
$group
db.emps.aggregate([{"$group":{"_id":"$job","count":{"$sum":1}}}])
求每个职位的人数
db.emps.aggregate([{"$group":{"_id":"$job","job_sla":{"$sum":"$salary"}}}])
求每个职位的总工资
db.emps.aggregate([{"$group":{"_id":"$job","job_sla":{"$avg":"$salary"}}}])
求每个职位的平均工资
db.emps.aggregate([{"$group":{"_id":"$job","job_sla":{"$min":"$salary"}}}])
求每个职位的最小工资
db.emps.aggregate([{"$group":{"_id":"$job","job_sla":{"$max":"$salary"}}}])
求每个职位的最大工资
db.emps.aggregate([{"$group":{"_id":"$job","job_sla":{"$max":"$salary"},"names":{"$push":"$name"}}}])
求出每个职员名称,如果需要去重的话使用addToSet
aggregate所有的分组数据的无序的,而且运行的数据是在内存中运行的,所以运行的数据量不会太多。
$project
普通列:({"成员":1|true})
"_id":({"_id":false|0})
筛选列({"成员":表达式})
db.emps.aggregate([{"$project":{"_id":0,"name":1,"sex":1}}])
project支持四则运算$add , $substract , $ multiply , $divide ,$mod
db.emps.aggregate([{"$project":{"_id":0,"name":1,"sex":1,"job":1,"salary":1,"年薪":{"$multiply":["$salary",12]}}}])
project支持关系运算$cmp比较大小 , $eq , $gt , $lt ,$gte ,$lte ,$ne ,$ifNull,返回的都是布尔值
project支持逻辑运算$and ,$or ,$not
project支持字符串操作$concat ,$substr ,$toLower ,$toUpper ,$strcasecmp
db.emps.aggregate([{"$project":{"_id":0,"name":1,"sex":1,"job":1,"salary":1,"年薪":{"$gte":["$salary",2000]}}}])
算出工资大于等于2000的员工
db.emps.aggregate([{"$project":{"_id":0,"name":1,"sex":1,"job":1,"salary":1,"职位":{"$strcasecmp":["$job","MANAGER"]}}}])
strcasecmp比较生成的是-1 ,0分别表示不等,相等
$sort
-1表示和1分别表示降序和升序
db.emps.aggregate([
{"$match":{"salary":{"$gt":2000,"$lte":10000}}},
{"$project":{"_id":0,"name":1,"salary":1,"job":1}},
{"$group":{"_id":"$job","count":{"$sum":1}}},
{"$sort":{"count":-1}}
])
查询出来的数据默认升序,我们加入降序的操作之后。查询出来的结果如下
$limit $skip
分页操作
db.emps.aggregate([
{"$match":{"salary":{"$gte":2000,"$lte":10000}}},
{"$project":{"_id":0,"name":1,"salary":1,"job":1}},
{"$group":{"_id":"$job","count":{"$sum":1}}},
{"$skip":1},
{"$limit":1}
])
$unwind
查询数据的时候需要将数组返回成字符串,使用$unwind便可以生成字符串
$out将处理完成的数据输出到一个指定的集合
版权声明: 原创文章,如需转载,请注明出处。