【MongoDB】二、MongoDB数据库的基本操作

实验目的实验内容任务一:(1)创建数据库newdb(2)在数据库newdb中创建集合mycollection(3)在集合mycollection中插入以下数据:(4)将标题为”MangoDB入门学习”更新为”MangoDB实践”(5)删除集合mycollection中的数据(6)删除集合mycollection(7)删除数据库newdb

任务二(1)创建名称为自己姓名拼音缩写的数据库。(2)在以自己姓名拼音缩写命名的数据库中创建集合students。(3)在集合students中插入以下数据。(4)将李慧英的英语成绩修改为88。(5)删除姓名是李贞贤的学生信息。(6)将张力的书架上的第二本书修改为“C#”。(7)给王敏的成绩中添加一门课“physical”,成绩为89。

任务三:文档简单查询(1)统计中国学生的人数(2)查询李姓学生的信息(3)查询集合students中姓名为”王敏”的学生信息(4)查询语文成绩大于80小于95的文档(5)查询书架上有“MongoDB”这本书的学生的姓名和年龄(6)查询书架上有“JAVA”或“JS”书的文档(7)查询数学成绩小于60或大于90的学生的姓名(8)查询英语成绩在60到90之间的学生的信息(9)查询书架上有4本书的学生的信息(10)查询国籍是“USA”或“China”的学生的姓名(11)查询国籍是USA并且语文成绩大于80的学生的信息

任务四:聚合操作(1)查询软件技术和移动应用开发专业学生的平均年龄(2)查看计算机应用技术专业男生和女生的总学分,最高学分和最低学分(3)查询各个专业学生的平均成绩,第一个人的成绩和最后一个人的成绩(4)统计各个专业的学生人数并按人数从多到少排序(5)显示成绩排名第4和第5的学生的姓名,专业和成绩(6)统计不同性别的学生姓名(7)查询年龄大于19的男生、女生人数

任务五:索引操作(1)在集合students的字段age上创建单字段索引,并指定顺序为降序(2)在集合students的字段major和字段credits上创建复合索引,指定字段major 为升序,字段credits为降序(3)查询数据库stu中集合students的索引(4)删除集合students字段age上的单字段索引(5)删除集合students中的所有索引

任务六:安全与访问控制(1)在admin数据库中创建管理员用户“useradmin”,密码为“123456”,拥有userAdminAnyDatabase角色。(2)开启用户访问控制:修改配置文件mongod.cfg,重启MongoDB服务(3)使用管理员账户useradmin在数据库admin中创建一个用户“sturead”,密码“123456”,并且该用户只具有stu数据库的read权限(4)新建连接,使用用户sturead连接数据库,并在stu数据库中创建用户“test”, 密码“123456”,使该用户具有stu数据库的readWrite权限。能否创建成功,为什么?(5)使用管理员账户useradmin在为用户sturead添加对stu数据库的userAdmin角色。使用用户sturead连接数据库,并在stu数据库中创建用户“test”, 密码“123456”,使该用户具有stu数据库的readWrite权限。能否创建成功,为什么?(6)修改sturead用户的密码为“sturead”(7)删除用户sturead

实验小结

实验目的

(1)能够使用mongo shell对数据库和集合进行操作。 (2)能够使用mongo shell对文档进行插入、更新及删除操作。 (3)总结mongo shell脚本常见语法错误的调试方法。 (4)能够使用find命令查询数据库中满足指定条件的文档。 (5)熟练使用 $group $limit $match $sort $project $skip等聚合管道操作符对文档进行查询、处理及分析。 (6)能够根据需要查看、创建、删除集合中的索引。 (7)列举MongoDB内置角色的权限,并理解MongoDB内置角色的权限。 (8)掌握开启用户访问控制的方法,并能够进行用户管理操作。

实验内容

任务一:

(1)创建数据库newdb

use newdb

(2)在数据库newdb中创建集合mycollection

db.createCollection("mycollection")

(3)在集合mycollection中插入以下数据:

{

title:”MangoDB入门学习”,

description:”MongoDB是一个NoSQL数据库”,

by:”数据库”,

tags:[MongoDB,DataBase,NoSQL]

}

db.mycollection.insertMany({title:"MangoDB入门学习",

description:"MongoDB是一个NoSQL数据库",

by:"数据库",

tags:["MongoDB","DataBase","NoSQL"]

})

(4)将标题为”MangoDB入门学习”更新为”MangoDB实践”

db.mycollection.update({title:"MangoDB入门学习"},{$set:{title:"MangoDB实践"}})

(5)删除集合mycollection中的数据

db.mycollection.remove({title:"MangoDB实践"})

(6)删除集合mycollection

db.mycollection.drop()

(7)删除数据库newdb

db.dropDatabase()

任务二

(1)创建名称为自己姓名拼音缩写的数据库。

use xxx

(2)在以自己姓名拼音缩写命名的数据库中创建集合students。

db.createCollection("students")

(3)在集合students中插入以下数据。

db.students.insertMany([

{name:"Jim",age:NumberInt(25),email:"75431457@qq.com",

score:{chinese:NumberInt(89),math:NumberInt(85),english:NumberInt(99)},country:"USA",

books:["JS","C++","EXTJS","MongoDB"]},

{name:"Tom",age:NumberInt(26),email:"214551267@qq.com",

score:{chinese:NumberInt(75),math:NumberInt(77),english:NumberInt(95)},country:"USA",

books:["PHP","JAVA","EXTJS","C++"]},

{name:"Lily",age:NumberInt(24),email:"344521234@qq.com",

score:{chinese:NumberInt(80),math:NumberInt(82),english:NumberInt(94)},country:"USA",

books:["JS","JAVA","C#","MongoDB"]},

{name:"李永",age:NumberInt(25),email:"214556745@qq.com",

score:{chinese:NumberInt(96),math:NumberInt(94),english:NumberInt(90)},country:"China",

books:["JS","JAVA","EXTJS", "MongoDB"]},

{name:"王敏",age:NumberInt(23),email:"274524359@qq.com",

score:{chinese:NumberInt(99),math:NumberInt(96),english:NumberInt(97)},country:"China",

books:["JS","C#","PHP", "MongoDB"]},

{name:"张力",age:NumberInt(22),email:"232435456@qq.com",

score:{chinese:NumberInt(89),math:NumberInt(97),english:NumberInt(89)},country:"China",

books:["JS","JAVA","C++", "MongoDB"]},

{name:"朴英俊",age:NumberInt(27),email:"645434239@qq.com",

score:{chinese:NumberInt(36),math:NumberInt(46),english:NumberInt(55)},country:"Korea",

books:["JS","JAVA", "EXTJS", "PHP"]},

{name:"李贞贤",age:NumberInt(24),email:"987555668@qq.com",

score:{chinese:NumberInt(35),math:NumberInt(75),english:NumberInt(64)},country:"Korea",

books:["JS","C#", "EXTJS", "MongoDB"]},

{name:"李慧英",age:NumberInt(26),email:"435567778@qq.com",

score:{chinese:NumberInt(45),math:NumberInt(63),english:NumberInt(77)},country:"Korea",

books:["JS","JAVA", "EXTJS", "MongoDB"]}

])

(4)将李慧英的英语成绩修改为88。

db.students.update({name:"李慧英的"},{$set:{"score.english":NumberInt(88)}})

(5)删除姓名是李贞贤的学生信息。

db.students.remove({name:"李贞贤"})

(6)将张力的书架上的第二本书修改为“C#”。

db.students.update({name:"张力"},{$set:{"books.1":"C#"}})

(7)给王敏的成绩中添加一门课“physical”,成绩为89。

db.students.update({name:"王敏"},{$set:{"score.physical":NumberInt(89)}})

任务三:文档简单查询

(1)统计中国学生的人数

db.students.find({country:"China"}).count()

(2)查询李姓学生的信息

db.students.find({name:/^李/})

(3)查询集合students中姓名为”王敏”的学生信息

db.students.find({name:"王敏"})

(4)查询语文成绩大于80小于95的文档

db.students.find({"score.chinese":{$gt:80,$lt:95}}).pretty()

(5)查询书架上有“MongoDB”这本书的学生的姓名和年龄

db.students.find({books:"MongoDB"},{_id:0,name:1,age:1})

(6)查询书架上有“JAVA”或“JS”书的文档

db.students.find({books:{$in:["JAVA","JS"]}})

(7)查询数学成绩小于60或大于90的学生的姓名

db.students.find({$or:[{"score.math":{$lt:60}},{"score.math":{$gt:90}}]})

(8)查询英语成绩在60到90之间的学生的信息

db.students.find({"score.english":{$gte:60,$lte:90}})

(9)查询书架上有4本书的学生的信息

db.students.find({books:{$size:4}})

(10)查询国籍是“USA”或“China”的学生的姓名

db.students.find({$or:[{country:"China"},{country:"USA"}]})

db.students.find({"country":{$in:["China","USA"]}},{name:1})

(11)查询国籍是USA并且语文成绩大于80的学生的信息

db.students.find({$and:[{country:'USA'},

{"score.chinese":{$gt:80}}]},

{name:1,country:1,"score.chinese":1})

任务四:聚合操作

(1)查询软件技术和移动应用开发专业学生的平均年龄

db.students.aggregate([

{$match:{major:{$in:["软件技术","移动应用开发"]}}},

{$group:{_id:"$major",ageavg:{$avg:"$age"}}}

])

(2)查看计算机应用技术专业男生和女生的总学分,最高学分和最低学分

db.students.aggregate([

{$match:{major:"计算机应用技术"}},

{$group:{_id:"$sex",sum_cre:{$sum:"$credits"},

max_cre:{$max:"$credits"},min_cre:{$min:"$credits"}}}

])

(3)查询各个专业学生的平均成绩,第一个人的成绩和最后一个人的成绩

db.students.aggregate({

$group:{

_id:"$major",

avg_sco:{$avg:"$score"},

fir_sco:{$first:"$score"},

last_sco:{$last:"$score"},

}})

(4)统计各个专业的学生人数并按人数从多到少排序

db.students.aggregate([{

$group:{_id:"$major",

sum:{$sum:1}}},

{$sort:{sum:-1}}

])

(5)显示成绩排名第4和第5的学生的姓名,专业和成绩

db.students.aggregate([

{$sort:{"score":-1}},

{$skip:4},

{$limit:2},

{$project:{_id:0,name:1,major:1,score:1}}

])

(6)统计不同性别的学生姓名

db.students.aggregate({

$group:{_id:"$sex",

"name":{$push:"$name"}

}})

(7)查询年龄大于19的男生、女生人数

db.students.aggregate([

{$match:{age:{$gt:19}}},

{$group:{_id:"$sex",count:{$sum:1}}}

])

任务五:索引操作

(1)在集合students的字段age上创建单字段索引,并指定顺序为降序

db.students.createIndex({age:-1})

(2)在集合students的字段major和字段credits上创建复合索引,指定字段major 为升序,字段credits为降序

db.students.createIndex({major:1,credits:-1})

(3)查询数据库stu中集合students的索引

db.students.getIndexes()

(4)删除集合students字段age上的单字段索引

db.students.dropIndex("age_-1")

(5)删除集合students中的所有索引

db.students.dropIndexes()

任务六:安全与访问控制

(1)在admin数据库中创建管理员用户“useradmin”,密码为“123456”,拥有userAdminAnyDatabase角色。

use admin

db.createUser({

user:"useradmin",

pwd:"123456",

roles:[{role:"userAdminAnyDatabase",db:"admin"}]

})

(2)开启用户访问控制:修改配置文件mongod.cfg,重启MongoDB服务

security:

authorization: enabled

(3)使用管理员账户useradmin在数据库admin中创建一个用户“sturead”,密码“123456”,并且该用户只具有stu数据库的read权限

use admin

db.createUser({

user:"sturead",

pwd:"123456",

roles:[{role:"read",db:"stu"}]

})

(4)新建连接,使用用户sturead连接数据库,并在stu数据库中创建用户“test”, 密码“123456”,使该用户具有stu数据库的readWrite权限。能否创建成功,为什么?

db.createUser({

user:"test",

pwd:"123456",

roles:[{role:"readWrite",db:"stu"}]

})

答:创建用户test失败,因为sturead用户对数据库stu只有读权限,没有管理权限。

(5)使用管理员账户useradmin在为用户sturead添加对stu数据库的userAdmin角色。使用用户sturead连接数据库,并在stu数据库中创建用户“test”, 密码“123456”,使该用户具有stu数据库的readWrite权限。能否创建成功,为什么?

db.grantRolesToUser("sturead",[{role:"userAdmin",db:"stu"}])

use stu

db.createUser({user:"test",pwd:"123456",roles:[{role:"readWrite",db:"stu"}]})

答:可以创建成功 因为给sturead用户添加了userAdmin权限(userAdmin权限允许用户向system.users集合写入,可以对指定数据库进行创建、删除操作和管理用户)。

(6)修改sturead用户的密码为“sturead”

db.changeUserPassword("sturead","sturead")

db.auth("sturead","sturead")

(7)删除用户sturead

use admin

db.dropUser("sturead")

实验小结

       通过本次实验,我熟练地使用Mongo Shell对数据库,集合,文档进行增删改的操作,以及流畅使用 $group $limit $match $sort $project $skip等聚合管道操作符对文档进行查询、处理及分析。在实验过程中遇到了很多硬件或者是软件上的问题,请教老师,询问同学,上网查资料,都是解决这些问题的途径。最终将遇到的问题一一解决最终完成实验。 注意事项: 1、有疑问前,知识学习前,先用搜索。 2、熟读写基础知识,学得会不如学得牢。 3、选择交流平台,如QQ群,网站论坛等。 4、尽我能力帮助他人,在帮助他人的同时你会深刻巩固知识。

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: