MongoDB基础学习三 ---- MongoDB的常用聚合操作

本文详细介绍了MongoDB的聚合操作,包括count、distinct、group、MapReduce、$group、$project、$match、$sort、$limit、$skip、$unwind、$geoNear和$out等。通过实例展示了如何进行数据统计、消除重复值、分组计算、数据过滤、排序、分页、数组展开和地理空间查询等操作,是理解MongoDB聚合功能的重要教程。
摘要由CSDN通过智能技术生成
# 聚合(重点)

# 产生背景:大数据的环境下。所谓的大数据实际上也就是进行信息收集汇总。也就是数据的统计操作,而这样的统计操作就称为聚合
# (直白来说:分组统计就是一种聚合操作)


--------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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值