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

2023-05-16

【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、尽我能力帮助他人,在帮助他人的同时你会深刻巩固知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MongoDB】二、MongoDB数据库的基本操作 的相关文章

  • 如何在 Meteor 应用程序之间共享 MongoDB 集合?

    我希望能够为我的项目提供一个管理应用程序和一个客户端应用程序 理想情况下 我希望能够拥有一个共享的 MongoDB 集合 我怎样才能做到这一点 我尝试在两个不同的应用程序中创建具有相同名称的集合 但发现 Meteor 会将数据分开 知道我能
  • mongodb 和 pymongo 文档大小 16Mb 限制

    我正在使用 Windows 上的 showIncludes 标志和 nix 上的 H 标志来分析构建中的包含内容 我正在用 python 脚本解析这些信息 包含的每个文件都变成一个对象 列出其子文件 它包含的文件 和祖先 包含该文件的包含路
  • 将MongoDb atlas数据库导出到本机Mongo compass

    我在 Atlas 中有一个名为 test 的远程数据库 我想将集合名称 image table 下载为 JSON 文件 在 Mac 终端中 mongoexport db test collection image table image j
  • 使用 MongoDB 作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

    我们目前正在为一家专业公司内部实施类似 CRM 的解决方案 由于存储信息的性质以及信息的不同值和键 我们决定使用文档存储数据库 因为它完全适合目的 在本例中我们选择 MongoDB 作为此 CRM 解决方案的一部分 我们希望存储实体之间的关
  • 是否可以从 MongoDB 查询返回计算字段?

    在 SQL 中我可以做类似的事情 SELECT myNum myNum 1 as increment FROM myTable 有效地执行任意数学和其他函数 并将它们作为结果中的字段返回 MongoDB 也可以做同样的事情吗 db test
  • Mongoose - 查询从多个集合中获取数据

    我想要获取猫鼬的查询在 Node js 应用程序中 如下所述输出 user js comment js 和 post js 是我使用的模型文件 user js var mongoose require mongoose var Schema
  • pymongo MongoClient 连接到 ReplicaSet

    我采用 pymongo 的 MongoClient 类来连接到具有三个节点 1 个主节点 2 个辅助节点 的副本集 代码片段如下 c MongoClient secondary1 hostname secondary2 hostname r
  • 如何对MongoDB子文档中的每个字段求和?

    当我在 MongoDB 中使用 db collection aggregate 时遇到问题 我有一个像这样的数据结构 id Segment S1 1 S2 5 Sn 10 这意味着以下内容Segment 我可能有几个带有数值的子属性 我想将
  • 如何将后端计时器与移动应用程序同步

    我正在开发一个选择用户并有 15 秒时间的应用程序 该用户响应的计时器 用户应用程序每 5 秒查询一次数据库 以查看是否选择了该用户 如果是这样 移动应用程序将开始 15 秒 定时器 问题是计时器永远不会匹配 因为用户应用程序可以位于与后端
  • 聚合两个数组中的 $sum 值

    我有这个合集 id ObjectId 54f46f18c36dcc206d0cec38 project 23123 title Change of windows description Change to better windows o
  • 为什么 mongo 的状态会抛出异常(code = exited,status = 48)?

    我在使用 mongo 时遇到了极其缓慢的情况 早些时候 当我输入 sudo systemctl status mongodb mongo 时 我出现在线并且呈绿色 现在几天后他开始抛弃我 mongodb service High perfo
  • 过滤$lookup结果

    我有 2 个集合 带有示例文档 reports id R1 type xyz 报告文件 id F1 reportid R1 time ISODate 2016 06 13T14 20 25 812Z id F14 reportid R1 t
  • 删除时忽略限制(猫鼬)

    我需要删除集合中最早的几个文档 所以我写了这样的内容 Model remove u abc sort id 1 limit 10 exec function err count count gives the total documents
  • 如何根据 node.js 中用户的输入创建 mongodb 查询?

    目前在我的应用程序中我存储了不同的论坛帖子 用户可以添加新消息并创建新帖子 其他用户在显示内容时可以对其进行过滤 这样他们就不会看到他们之前阻止的特定用户上传的内容 每个用户都表示为以下组合device id and display nam
  • 在mongo聚合中选择* group by

    我正在尝试做一些我认为很简单的事情 假设我在 mongo 中有一系列具有公共键和可变数量属性的记录 我想选择记录中的所有属性并按名称分组 例如 Name George x 5 y 3 Name George z 9 Name Rob x 1
  • 如何在 mongodb 中对数组进行 AND 查询?

    我有一个带有标签的数组 它是文档的一部分 例如 红 绿 蓝 白 黑 现在我想找到所有有红色和蓝色的文档 使用 all 条件查找同时匹配 红色 和 蓝色 条件的记录 db my collection find tags all red blu
  • Mongoose update 更新数组内的嵌套对象

    我正在尝试查询和更新名册数组 roster schedule monday start 中的元素 然后更新本示例中的值 monday start 这两个键需要是动态的 我认为方法会是这样的 通过 id查找文档 通过 id 在数组中查找匹配对
  • 将 mongoid 会话设置为只读

    我有不同的会话mongoid yml 其中一个会话提供来自静态 mongo 数据库的数据 我想知道是否有可能以只读模式 加载 会话 以便不进行任何更改save create destroy or destroy all可以制作 我的mong
  • MongoDB:查询速度慢,即使有索引

    我有一个网页 它使用 MongoDB 来存储和检索各种测量结果 突然 在某个时候 我的网页变得如此缓慢 以至于无法使用 事实证明 我的数据库是罪魁祸首 我进行了搜索 但没有找到任何解决我的问题的方法 我很抱歉 因为我对 MongoDB 还很
  • 在原子操作中测试和递减?

    我刚刚发现了一个恼人的错误 它基本上是一个竞争条件 为了便于论证 我们假设一个非常简单的文档结构 例如 id XXX amount 100 集合中存在数百个这样的文档 并且由多个编写器访问 这些编写器有效地尝试将数量降低任何值 但绝不会低于

随机推荐