7、聚合(重点)
MongoDB的产生背景是在大数据环境,所谓的大数据实际上也就是进行信息的收集汇总。FlashCookie了解一下。那么就必须存在有信息的统计操作,而这样的统计操作就称为聚合(直白:分组统计就是一种聚合操作)
7.1、取得集合的数据量
对于集合的数据量而言,在MongoDB里面直接使用count()就可以完成。
范例:统计student集合中的数据量
db.student.count();
范例:模糊查询
db.student.count({"name":/张/i});
在进行信息查询的时候,不设置条件永远要比设置条件的查询快很多,也就是说在之前的代码编写里面不管是查询全部还是模糊查询,实际上最终都使用的是模糊查询一种(没有设置关键字)。记得以后如果是全集合查询,就不要带关键字了。
7.2、消除重复数据
在学习SQL的时候对于重复的数据可以使用“DISTINCT”,那么这一操作在MongoDB之中依然支持。
先在student集合中插入一个重复的name信息,如果有索引先删除掉
db.student.insert({"name":"张三","sex":"女","age":22,"score":100,"address":"房山区"});
范例:查询所有name的信息
本次的操作没有直接的函数支持,只能够利用runCommand()函数。
db.runCommand({"distinct":"student","key":"name"})
此时实现了对于name数据的重复值的筛选。
7.3、group操作
使用group操作可以实现数据的分组操作,在MongoDB里面会将集合依据指定的key的不同进行分组操作,并且每一个组都会产生以处理的文档结果。
范例:查询所有年龄大于等于19岁的学生信息,并且按照年龄分组
db.runCommand({"group":{
"ns":"student",
"key":{"age":true},
"initial":{"count":0},
"condition":{"age":{"$gte":19}},
"$reduce":function(doc,prev){
prev.count++; //标识数量+1
}
}})
以上的操作代码里面实现的就属于一种MapReduce,但是这样只是根据传统的数据库设计思路实现了一个所谓的分组操作,但是这个分组操作的最终结果是有限的(比如想搞个平均值就比较麻烦)。这种写法后续用的不多,但是这是开启聚合的第一步。
7.4、MapReduce
MapReduce是整个大数据的精髓所在(实际中别用),所谓的MapReduce就是分为两步处理数据:
Map:将数据分别取出
Reduce:负责数据的最后的处理。
可是要想在MongoDB里面实现MapReduce处理,那么复杂度是相当高的。
范例:建立一组雇员数据:
db.emps.insert({"name":"张三","age":30,"sex":"男","job":"CLERK","salary":1000});
db.emps.insert({"name":"李四","age":28,"sex":"女","job":"CLERK","salary":5000});
db.emps.insert({"name":"王五","age":26,"sex":"男","job":"MANAGER","salary":6000});
db.emps.insert({"name":"赵六","age":32,"sex":"女","job":"MANAGER","salary":7000});
db.emps.insert({"name":"孙七","age":31,"sex":"男","job":"CLERK","salary":2000});
db.emps.insert({"name":"王八","age":35,"sex":"女","job":"PRESIDENT","salary":9000});
使用MapReduce操作最终会将处理结果保存在一个单独的集合里面,而最终的处理效果如下:
范例:按照职位分组,取得每个职位的人名
第一步:编写分组的定义:
var jobMapFun=function(){
emit(this.job,this.name); //按照job分组,取出name
};
第一组:{key:"CLERK", values: [姓名,姓名,...]}
第二步:编写reduce操作:
var jobR