MongoDB实验——使用分组、聚合和映射—归并

实验——使用分组、聚合和映射—归并

一、实验目的

掌握在 MongoDB 中使用分组、聚合和映射-归并框架来操作一系列文档的方法。

二、实验原理

1.分组
1)runCommand 函数————返回更新或者删除的文档
2)Group 函数————分组

db.runCommand({
group:{
 ns:集合名字,
 Key:分组的键对象,
 Initial:初始化累加器,
 $ reduce:组分解器,
 Condition:条件,
 Finalize:组完成器
}
})

说明:分组首先会按照 key 进行分区,每组的每个文档全部要执行$reduce 的方法,其中参数为:一个是组内本条记录,一个是累加器数据。

3 aggregate 聚合操作
MongoDB 的聚合操作,接受一个名为 pipeline 的参数和一个可选参数。pipeline 可以理解为流水线,一条流水线上可以有一个或多个工序。所以,mongodb 的一次聚合操作就是对一个表进行多个工序的加工,其中的每个工序都可以修改、增加、删除文档,最终产出需要的数据集合。基本的操作包括:
在这里插入图片描述
4. mapReduce
其实是一种编程模型,用在分布式计算中,其中有一个“map”函数,一个“reduce“函数。 map:这个称为映射函数,里面会调用emit(key,value),集合会按照你指定的 key 进行映射分组。reduce:这个称为简化函数,会对 map 分组后的数据进行分组简化,注意:在reduce(key,values)中的 key 就是 emit 中的 key,values 为 emit 分组后的 emit(value)的集合。
详解:
1)map 部分
作用:用于分组的。
emit(param1, param2)
其中:param1:需要分组的字段,this.字段名param2:需要进行统计的字段,this.字段
名。
2) reduce 部分
作用:处理需要统计的字段
var reduce = function(key, values){
…统计字段处理
}
其中:key: 指分组字段(emit 的 param1)对应的值;values:指需要统计的字段(emit的 param2)值组成的数组

简单介绍统计常用的方法:

  • 对数值类型进行求和
  1. var reduce = function(key, values){
  2. return Array.sum(values);
  3. }
  • 对字符串类型进行拼凑
  1. var reduce = function(key, values){
  2. return values.join(', ');
  3. }

3)options 部分
{ query: { age: {$lt: 25} }, out: “name_totals” }
其中:query:先筛选符合条件的记录出来,再进行分组统计。
out:将分组统计后的结果输出到哪个集合当中。
默认情况下,out 所指定的集合在数据库断开连接后再次打开时,依旧存在,并保留之前的所有记录的。
4) 执行分组统计
db.集合名.mapReduce( map, reduce, options )

三、实验内容

1.在 MongoDB shell 中查询数据
2.根据字段值将文档分组
3.使用聚合流水线来操作结果
4.使用映射-归并生成新的数据结果

四、实验步骤

1.查询
1 )查询出 persons 中一共有多少个国家分别是什么
db.runCommand({distinct:"persons“ , key:“country”}).values
在这里插入图片描述
2)查出 persons 中每个国家学生数学成绩最好的学生信息(必须在 90 以上)
在这里插入图片描述
3)上例要求基础之上把每个人的信息链接起来写一个描述赋值到 m 上
在这里插入图片描述
2. 聚合操作
1)创建名为 TestOrder 的表,表中的记录如下:
在这里插入图片描述
2)如果需要按 status 字段统计 amount 总额,并且只统计 status 为 A、B 或 C 的记录,可以用聚合操作进行统计。
第一步:从 TestOrder 中找出 status 为 A、B 或 C 的记录。这是流水线的第一道工序,表达式如下:
{ $ match: { status: { $in: [‘A’,‘B’,‘C’] } } }
第二步:按 status 统计 amount 总额。这是流水线的第二道工序,表达式如下:
{ KaTeX parse error: Expected '}', got 'EOF' at end of input: group: { _id: 'status’, totalAmount: { s u m : ′ sum: ' sum:amount’ } } }
最终的聚合操作命令,以及结果。
在这里插入图片描述
3.MapReduce
插入一些测试用的数据
在这里插入图片描述
需求 1:统计不同地方(“Guangzhou,Beijing,Shanghai”)的人的岁数总和。
在这里插入图片描述
在这里插入图片描述
需求 2:统计不同地方(“Guangzhou,Beijing,Shanghai”)的人数总和。
在这里插入图片描述
需求 3:统计不同地方(“Guangzhou,Beijing,Shanghai”)的人名列表。
在这里插入图片描述
需求 4:统计不同地方(“Guangzhou,Beijing,Shanghai”),并且年龄在 25 岁(不包括 25 岁)以下的人名列表。
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Augenstern K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值