一、实验综述
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进行分组; ②使用
group操作符,将集合comment中的文档按userid进行分组;②使用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的文档查询出来; ④使用
match操作符,将集合comment中键nickname的值为Rose的文档查询出来;④使用sort操作符,将集合comment中的文档按照键age的值进行升序排序;
⑤使用
p
r
o
j
e
c
t
操
作
符
,
展
示
集
合
c
o
m
m
e
n
t
中
的
文
档
,
并
且
文
档
均
不
包
含
字
段
i
d
;
⑥
使
用
project操作符,展示集合comment中的文档,并且文档均不包含字段_id; ⑥使用
project操作符,展示集合comment中的文档,并且文档均不包含字段id;⑥使用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总和; ④使用
sum表达式,将集合product中的文档按类型type进行分组并计算各个分组的价格price总和;④使用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最大值; ⑥使用
max表达式,将集合product中的文档按类型type进行分组,并计算各个分组中价格price最大值;⑥使用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、分析讨论