# 聚合(重点)
# 产生背景:大数据的环境下。所谓的大数据实际上也就是进行信息收集汇总。也就是数据的统计操作,而这样的统计操作就称为聚合
# (直白来说:分组统计就是一种聚合操作)
--------1--------
# 取得集合的数据量(count)
# 对MongoDB而言,直接使用count()函数就可以完成。
# 范例1:统计student表中的数据量
db.student.count()
# 范例2:模糊查询
db.student.count({"name" : /王/i});
# 在进行信息查询的时候,不设置条件永远要比设置条件的查询快很多,也就是说在之前的代码编写中不管是查询全部还是模糊查询。
# 实际上最终都使用模糊查询的一种(只不过没有设置关键字)。
--------2--------
# 消除重复数据(distinct)
# 范例1:查询所有的 title 信息,news 数据库已经存在,并且含有重复字段
|- 本次操作没有直接的函数支持,只能使用 runCommand() 函数
db.runCommand({"distinct" : "news", "key" : "title"});
|- 此时实现了对于title数据的重复值的筛选。
--------3--------
# group操作
# 使用 group 操作可以实现数据的分组操作,在 MongoDB 里面会将集合依据指定的 key 的不同进行分组操作,
# 并且每一个组都会产生一个处理的文档结果
# 范例1:查询所有年龄大于等于 28 岁的学生信息, 并且按照年龄分组
db.runCommand(
{
"group" : {
"ns" : "student", // 操作集合
"key" : {"age" : true}, // 设置分组列
"initial" : {"count" : 0}, //初始化一个变量,用于统计每个分组的数据量
"condition" : {"age" : {"$gte" : 28}}, // 分组的条件
"$reduce" : function(doc, prev){ // 执行统计操作
prev.count ++;
}
}
}
);
# 以上的操作代码里面实现的就属于一种 MapReduce ,但是这样只是根据传统的数据库的设计思路,实现了一个所谓的分组操作
# 但是这个分组操作的最终结果是有限的
--------4--------
# MapReduce
# 是整个数据库的精髓所在(实际中别用),所谓的 MapReduce 就是分两步处理数据
|- Map: 将数据分别取出
|- Reduce: 负责数据的最后处理
# 但是想要在 MongoDB 里面实现 MapReduce 处理,那么复杂度相当高
# 范例1:建立一组雇员数据
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" : 10000})
|- 使用 MapReduce 操作最终会将处理结果保存在一个单独的集合里面
# 范例1: 按照职位分组,取得每个职位的人名
|- 第一步:编写分组的定义 Map
var jobMapFun = function() {
emit(this.job, this.name); // 按照 job 分组,取出 name
};
# 分组结果为如下所示: {key : job, values : [name1, name2, ...]}
|- 第二步:编写 reduce 操作
var jobReduceFun = function(key, values) {
return {"job" : key, "names" : values};
};
|- 第三步(可选):使用 MapReduce 处理的数据实际上也可以执行一个最后处理
var jobFinalizeFun = function(key, values){
if (key == "PRESIDENT"){
return {"job" : key, "names" : values, "info" : "总裁"};
}
return {"job" : key, "names" : values};
};
|- 第四步:进行操作的整合
db.runCommand(
{
"mapreduce" : "emps", // 指定需要操作的集合
"map" : jobMapFun, // 指定Map方法对应的函数
"reduce" : jobReduceFun, // 指定Reduce方法对应的函数
"out" : "t_job_emps", // 输出到 t_job_emps 集合中
"finalize" : jobF
MongoDB基础学习三 ---- MongoDB的常用聚合操作
本文详细介绍了MongoDB的聚合操作,包括count、distinct、group、MapReduce、$group、$project、$match、$sort、$limit、$skip、$unwind、$geoNear和$out等。通过实例展示了如何进行数据统计、消除重复值、分组计算、数据过滤、排序、分页、数组展开和地理空间查询等操作,是理解MongoDB聚合功能的重要教程。
摘要由CSDN通过智能技术生成