掌握聚合管道操作,熟悉Map-Reduce操作

一、实验综述

1、实验目的及要求
(1)掌握聚合管道操作
(2)熟悉Map-Reduce操作
(3)掌握索引相关概念
(4)掌握索引操作
实验过程:
1、数据库、集合、文档内容均使用实验二中的数据
2、聚合管道操作符:
①使用 g r o u p 操 作 符 , 将 集 合 c o m m e n t 中 的 文 档 按 u s e r i d 进 行 分 组 ; ② 使 用 group操作符,将集合comment中的文档按userid进行分组; ②使用 groupcommentuserid使limit操作符,展示集合comment中前2个文档;
③使用 m a t c h 操 作 符 , 将 集 合 c o m m e n t 中 键 n i c k n a m e 的 值 为 R o s e 的 文 档 查 询 出 来 ; ④ 使 用 match操作符,将集合comment中键nickname的值为Rose的文档查询出来; ④使用 matchcommentnicknameRose使sort操作符,将集合comment中的文档按照键age的值进行升序排序;
⑤使用 p r o j e c t 操 作 符 , 展 示 集 合 c o m m e n t 中 的 文 档 , 并 且 文 档 均 不 包 含 字 段 i d ; ⑥ 使 用 project操作符,展示集合comment中的文档,并且文档均不包含字段_id; ⑥使用 projectcommentid使skip操作符,展示集合comment中的_id为3、4的文档;
3、聚合管道表达式:
①在articledb数据库创建集合product;
②向集合product中插入五个文档,内容如下:
{“_id”:“1”,“name”:“iPhone 8”,“price”:3000,“type”:“电子通讯”},
{“_id”:“2”,“name”:“adidas neo”,“price”:700,“type”:“服装”},
{“_id”:“3”,“name”:“nike air max 90”,“price”:760,“type”:“服装”},
{“_id”:“4”,“name”:“HuaWei mate30”,“price”:5000,“type”:“电子通讯”},
{“_id”:“5”,“name”:“vivo x27”,“price”:2000,“type”:“电子通讯”},
③使用 s u m 表 达 式 , 将 集 合 p r o d u c t 中 的 文 档 按 类 型 t y p e 进 行 分 组 并 计 算 各 个 分 组 的 价 格 p r i c e 总 和 ; ④ 使 用 sum表达式,将集合product中的文档按类型type进行分组并计算各个分组的价格price总和; ④使用 sumproducttypeprice使avg表达式,将集合product中的文档按类型type进行分组,并计算各个分组的价格price平均值;
⑤使用 m a x 表 达 式 , 将 集 合 p r o d u c t 中 的 文 档 按 类 型 t y p e 进 行 分 组 , 并 计 算 各 个 分 组 中 价 格 p r i c e 最 大 值 ; ⑥ 使 用 max表达式,将集合product中的文档按类型type进行分组,并计算各个分组中价格price最大值; ⑥使用 maxproducttypeprice使push表达式,将集合product中的文档按类型type进行分组,并将各个分组的产品插入到一个数组tags中;
⑦使用$first表达式,将集合product中的文档按类型type进行分组,并获取各个分组中第一个产品。
4、Map-Reduce操作
①查询集合comment中字段state为1的文档,按照字段nickname对文档进行分组,计算出每个评论者的评论条数;
②查询结果集合comment_total中的结果数据。
5、索引操作
①查询数据库articledb中集合comment的索引;
②查询数据库articledb中集合comment的索引大小;
③在集合comment的字段userid上创建单字段索引,并指定顺序为升序;
④在集合comment的字段userid和字段nickname上创建复合索引,指定字段userid 为升序,字段nickname为降序;
⑤ 查询集合comment中的索引;
⑥删除集合comment字段userid上的单字段索引;
⑦删除所有索引。
认真完成实验题,能正确运行,提交实验报告并上传程序,实验报告要求写出操作步骤、结果、问题、解决方法、体会等。
2、实验仪器、设备或软件
计算机、Linux、VMvare15pro、Secure CRT、MongoDB4.2、相关的操作系统等。

二、实验过程(实验步骤、代码、数据、过程截图)

1、使用$group操作符,将集合comment中的文档按userid进行分组;如下图2-1所示。代码:

db.comment.aggregate([{$group:{"_id":"$userid"}}]).pretty()
在这里插入图片描述

图2-1将集合comment中的文档按userid进行分组
2、使用$limit操作符,展示集合comment中前2个文档;如下图2-2所示。代码:

db.comment.aggregate({$limit:2}).pretty()
在这里插入图片描述

图2-2展示集合comment中前2个文档
3、使用$sort操作符,将集合comment中的文档按照键age的值进行升序排序;如下图2-3所示。代码:

db.comment.aggregate([{$sort:{"age":1}}]).pretty()
在这里插入图片描述

图2-3将集合comment中的文档按照键age的值进行升序排序
4、使用$project操作符,展示集合comment中的文档,并且文档均不包含字段_id;如下图2-4所示。代码:

db.comment.aggregate([{$project:{"_id":0}}]).pretty()
在这里插入图片描述

图2-4展示集合comment中的文档,并且文档均不包含字段_id
5、使用$match操作符,将集合comment中键nickname的值为Rose的文档查询出来;如下图2-5所示。代码:

db.comment.aggregate([{$match:{"nickname":"Rose"}}]).pretty()
在这里插入图片描述

图2-5将集合comment中键nickname的值为Rose的文档查询出来
6、使用$skip操作符,展示集合comment中的_id为3、4的文档;如下图2-6所示。代码:

db.comment.aggregate({$skip:2}).pretty()
在这里插入图片描述

图2-6展示集合comment中的_id为3、4的文档
7、在articledb数据库创建集合product;如下图2-7所示。代码:
use articledb,db.createCollection(“product”)
在这里插入图片描述

图2-7在articledb数据库创建集合product
8、向集合product中插入五个文档。如下图2-8所示。代码:

db.product.insertMany([
{"_id":"1","name":"iPhone 8","price":3000,"type":"电子通讯"},
{"_id":"2","name":"adidas neo","price":700,"type":"服装"},
{"_id":"3","name":"nike air max 90","price":760,"type":"服装"},
{"_id":"4","name":"HuaWei mate30","price":5000,"type":"电子通讯"},
{"_id":"5","name":"vivo x27","price":2000,"type":"电子通讯"},
])

在这里插入图片描述

图2-8向集合product中插入五个文档
9、使用$sum表达式,将集合product中的文档按类型type进行分组并计算各个分组的价格price总和;如下图2-9所示。代码:

db.product.aggregate([{$group:{"_id":"$type","price":{$sum:"$price"}}}]).pretty()
在这里插入图片描述

图2-9将集合product中的文档按类型type进行分组并计算各个分组的价格price总和
10、使用$avg表达式,将集合product中的文档按类型type进行分组,并计算各个分组的价格price平均值;如下图2-10所示。代码:

db.product.aggregate([{$group:{"_id":"$type","price":{$avg:"$price"}}}]).pretty()
在这里插入图片描述

图2-10将集合product中的文档按类型type进行分组,并计算各个分组的价格price平均值
11、使用$max表达式,将集合product中的文档按类型type进行分组,并计算各个分组中价格price最大值;如下图2-11所示。代码:

db.product.aggregate([{$group:{"_id":"$type","price":{$max:"$price"}}}]).pretty()
在这里插入图片描述

图2-11将集合product中的文档按类型type进行分组,并计算各个分组中价格price最大值
12、使用$push表达式,将集合product中的文档按类型type进行分组,并将各个分组的产品插入到一个数组tags中;如下图2-12所示。代码:

db.product.aggregate([{$group:{"_id":"$type","tags":{$push:"$name"}}}]).pretty()
在这里插入图片描述

图2-12将集合product中的文档按类型type进行分组,并将各个分组的产品插入到一个数组tags中
13、使用$first表达式,将集合product中的文档按类型type进行分组,并获取各个分组中第一个产品。如下图2-13所示。代码:

db.product.aggregate([{$group:{"_id":"$type","product":{$first:"$name"}}}]).pretty()
在这里插入图片描述

图2-13将集合product中的文档按类型type进行分组,并获取各个分组中第一个产品
14、查询集合comment中字段state为1的文档,按照字段nickname对文档进行分组,计算出每个评论者的评论条数;查询结果集合comment_total中的结果数据。如下图2-14所示。代码:

db.comment.mapReduce(
	function(){emit(this.nickname,"1");},
	function(key,values){return Array.sum(values)},
	{
		query:{state:"1"},
		out:"comment_total"
	}
  )
db.comment_total.find()

在这里插入图片描述

图2-14查询集合comment中字段state为1的文档,按照字段nickname对文档进行分组,计算出每个评论者的评论条数;查询结果集合comment_total中的结果数据
15、查询数据库articledb中集合comment的索引;如下图2-15所示。代码:db.comment.getIndexes()
在这里插入图片描述

图2-15查询数据库articledb中集合comment的索引
16、查询数据库articledb中集合comment的索引大小;如下图2-16所示。代码:db.comment.totalIndexSize()
在这里插入图片描述

图2-16查询数据库articledb中集合comment的索引大小
17、在集合comment的字段userid上创建单字段索引,并指定顺序为升序;如下图2-17所示。代码:db.comment.createIndex({userid:1})
在这里插入图片描述

图2-17在集合comment的字段userid上创建单字段索引,并指定顺序为升序
18、在集合comment的字段userid和字段nickname上创建复合索引,指定字段userid 为升序,字段nickname为降序;如下图2-18所示。代码:db.comment.createIndex({userid:1,nickname:-1})
在这里插入图片描述

图2-18在集合comment的字段userid和字段nickname上创建复合索引,指定字段userid 为升序,字段nickname为降序
19、查询集合comment中的索引;如下图2-19所示。代码:db.comment.getIndexes()
在这里插入图片描述

图2-19查询集合comment中的索引
20、删除集合comment字段userid上的单字段索引;如下图2-20所示。代码:db.comment.dropIndex({userid:1})
在这里插入图片描述

图2-20删除集合comment字段userid上的单字段索引
**21.**删除所有索引。如下图2-21所示。代码:db.comment.dropIndexes()
在这里插入图片描述

图2-21删除所有索引
三、结论
1、分析讨论

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值