一、MongoDB介绍
1.1 MongoDB简介
MongoDB是一个开源的文档型NoSQL数据库管理系统,它支持强大的面向文档的数据模型设计。它是一个分布式文件存储数据库系统,被设计用于处理大量的结构不确定、经常变化的数据。 MongoDB采用了类似于JSON的BSON(Binary JSON)格式来存储数据,形式非常灵活,可以支持各种类型的数据结构和数据模型。与传统的关系型数据库不同的是,MongoDB不使用表格来存储数据,而是采用集合(Collection)的概念,同一个集合中可以存储不同的文档(Document),每个文档可以有自己的数据结构。此外,MongoDB还支持多种数据操作,包括聚合管道(Aggregation Pipeline)、地理空间查询(Geospatial Query)等,可以满足广泛的数据处理需求。
1.2 MongoDB特点
MongoDB的特点包括:
- 文档存储:MongoDB使用文档格式来存储数据,这个格式非常灵活,可以存储各种不同类型的数据。
- 高性能:MongoDB可以处理海量数据,并且具有出色的性能表现。它支持水平扩展,可以使用多台机器处理数据。
- 高可用性:MongoDB支持副本集和分片功能,可以自动处理数据备份和故障恢复。
- 动态查询:MongoDB使用类似于SQL的查询语言,同时还支持复杂的查询和聚合操作。
- 灵活性:MongoDB非常灵活,可以快速适应不同的需求和变化。
- 高可扩展性:MongoDB可以很容易地实现数据的水平扩展,可以承载数十亿条记录。
- 开放源代码:MongoDB是开放源代码的,可以免费使用,其中包括社区版和企业版。
二、MongoDB的初始连接
2.1 查看当前MongoDB状态
查看MongoDB服务状态
| [root@jeven ~] |
| ● mongod.service - MongoDB Database Server |
| Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled) |
| Active: active (running) since Fri 2023-09-15 00:01:03 CST; 31s ago |
| Docs: https://docs.mongodb.org/manual |
| Main PID: 23735 (mongod) |
| CGroup: /system.slice/mongod.service |
| └─23735 /usr/bin/mongod -f /etc/mongod.conf |
| |
| Sep 15 00:01:03 jeven systemd[1]: Started MongoDB Database Server. |
| Sep 15 00:01:03 jeven mongod[23735]: {"t":{"$date":"2023-09-14T16:01:03.336Z"},"s":"I", "c":"CONTROL", "id":7484500, "ctx":"-","msg":"Environment variable MONG... to false"} |
| Hint: Some lines were ellipsized, use -l to show in full. |
2.2 查看MongoDB版本
查看MongoDB版本
| [root@jeven ~]# mongo --version |
| MongoDB shell version v5.0.21 |
| Build Info: { |
| "version": "5.0.21", |
| "gitVersion": "4fad44a858d8ee2d642566fc8872ef410f6534e4", |
| "openSSLVersion": "OpenSSL 1.0.1e-fips 11 Feb 2013", |
| "modules": [], |
| "allocator": "tcmalloc", |
| "environment": { |
| "distmod": "rhel70", |
| "distarch": "x86_64", |
| "target_arch": "x86_64" |
| } |
| } |
2.3 本地连接MongoDB
本地服务器连接MongoDB,直接使用mongo命令进行本地连接。
mongo

2.4 退出MongoDB操作
使用以下命令,退出MongoDB操作。
quit()

2.5 MongoDB服务操作
systemctl start mongod
systemctl enable mongod
systemctl disable mongod
- 停止MongoDB服务systemctl stop mongodb
三、MongoDB数据库内环境检查操作
3.1 查询MongoDB版本
在MongoDB数据库内,查询当前版本。
3.2 检查服务器状态
使用以下命令,查询服务器状态。
| > db.serverStatus() |
| { |
| "ok" : 0, |
| "errmsg" : "not authorized on admin to execute command { serverStatus: 1.0, lsid: { id: UUID(\"3a882f25-2e90-46fd-a9ff-52fd452589ec\") }, $db: \"admin\" }", |
| "code" : 13, |
| "codeName" : "Unauthorized" |
| } |
3.3 检查数据库环境信息
检查数据库环境信息
db.serverBuildInfo()

四、MongoDB的用户管理
4.1 MongoDB的用户介绍
MongoDB提供了多种方式进行用户管理,包括:
- 内置的admin用户:MongoDB内置的admin用户是超级管理员,具有所有权限,包括用户管理、数据库管理、角色管理等。
- 创建普通用户:可以使用命令或MongoDB Shell创建普通用户,并赋予其不同的角色权限。
- 角色:MongoDB中的角色是对权限进行分组的一种机制,可以将一组权限授予一个角色,并将该角色分配给多个用户使用。
4.2 MongoDB的用户角色与权限
数据库用户角色:read、readWrite; 数据库管理角色:dbAdmin、dbOwner、userAdmin; 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 备份恢复角色:backup、restore; 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、>dbAdminAnyDatabase 超级用户角色:root 内部角色:__system
read:允许用户读取指定数据库; readWrite:允许用户读写指定数据库; dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.>profile; userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户; readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限; readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限; dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限; clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限; userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限; root:只在admin数据库中可用。超级账号,超级权限;
4.3 创建用户
1.MongoDB安装完成后,数据库 admin 中没有任何用户账户。此时,MongoDB 向从本地主机发起的连接提供完整的数据库管理权限。因此配置 MongoDB 新实例时,首先需要创建用户管理员账户和数据库管理员账户。用户管理员账户可在 admin 和其他数据库中创建用户账户。 2.数据库管理员账户,用于管理数据库、集群、复制和 MongoDB 其他方面的超级用户。用户管理员账户和数据库管理员账户都是在数据库 admin 中创建的。在 MongoDB 服务器中启用身份验证后,要以用户管理员或数据库管理员的身份连接到服务器,必须向 admin 数据库验证身份,您还需在每个数据库中创建用户账户,让这些用户能够访问该数据库。
| use admin; |
| db.createUser({ |
| user: "admin", |
| pwd: "admin", |
| roles: [ |
| {role: "userAdminAnyDatabase",db: "admin"} |
| ] |
| } |
| ) |

4.4 启用用户认证
在/etc/mongod.conf配置文件中,security模块部分启用认证。
| security: |
| authorization: enabled |

4.5 用户验证
重启mongodb服务后,需要执行以下命令,进行用户验证。
| rs0:PRIMARY> use admin |
| switched to db admin |
| rs0:PRIMARY> db.auth("admin","admin") |
| 1 |
4.6 用户验证登录
在连接mongodb时,使用用户管理员admin进行认证登录。
| [root@jeven ~]# mongo -uadmin -padmin --authenticationDatabase admin |
| MongoDB shell version v5.0.21 |
| connecting to: mongodb: |
| Implicit session: session { "id" : UUID("34538acc-e5d6-4490-bf7d-01fd87d7ba4d") } |
| MongoDB server version: 5.0.21 |
| ================ |
| Warning: the "mongo" shell has been superseded by "mongosh", |
| which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in |
| an upcoming release. |
| For installation instructions, see |
| https: |
| ================ |
| > |
4.7 创建超级管理员账号
创建超级管理员账号root,角色为root。
| db.createUser({ |
| user: "root", |
| pwd: "root", |
| roles: [ "root" ] |
| } |
| ) |

创建普通用户
| use admin; |
| db.createUser({ |
| user: "jeven", |
| pwd: "jeven", |
| roles: [{role: "readWrite", db: "test"}] |
| } |
| ) |

4.8 查询用户信息
| > show users; |
| { |
| "_id" : "test.jeven", |
| "userId" : UUID("9e772f7d-0eb2-47ca-b6dd-c839b6e581ef"), |
| "user" : "jeven", |
| "db" : "test", |
| "roles" : [ |
| { |
| "role" : "readWrite", |
| "db" : "test" |
| } |
| ], |
| "mechanisms" : [ |
| "SCRAM-SHA-1", |
| "SCRAM-SHA-256" |
| ] |
| } |
db.system.users.find().pretty()

4.9 删除用户
执行以下命令,删除用户。
| use admin; |
| db.auth("admin","admin"); |
| db.dropUser("jeven") |
4.10 修改用户密码
| use admin |
| db.changeUserPassword("jeven","aa123" ) |
五、数据库和集合的基本操作
5.1 新建数据库
新建数据库
| > use huawei; |
| switched to db huawei |
5.2 查看数据库
查看数据库
| > show dbs |
| admin 0.000GB |
| config 0.000GB |
| local 0.000GB |
可以看到,我们刚创建的数据库huawei 并不在数据库的列表中,要显示它,我们需要向huawei数据库插入一些数据。
db.huawei.insertOne({"name":"mall"})

- 再次查询所有数据库,发现huawei数据库已经显示在列表中国。
| > show dbs; |
| admin 0.000GB |
| config 0.000GB |
| huawei 0.000GB |
| local 0.000GB |
5.3 创建集合
创建集合
db.createCollection("class")

5.4 查看集合内容
查看某个集合内容
db.class.find()
5.5 查看数据下所有集合
查看数据下所有集合
| > show tables |
| class |
| huawei |
| runoob |
5.6 删除集合
删除某个集合
| > db.huawei.drop() |
| true |
| > show tables |
| class |
| runoob |
5.7 删除数据库
删除某个数据库
| > use huawei; |
| switched to db huawei |
| > db.dropDatabase(); |
| { "ok" : 1 } |
六、MongoDB数据的基本操作
6.1 插入文档
在class集合内插入文档数据
db.class.insert({ "name": "natasha", "age": "18", "genden": "female" });
6.2 更新文档数据
再插入一条数据库
db.class.insert({ "type" : "phone", "price" : "3999", "xinghao" : "huawei", "desc" : "xxx" });
更新文档数据
db.class.update({"type" : "phone"},{$set:{ "type": "televison"}})
查看集合内容
| > db.class.find() |
| { "_id" : ObjectId("6503466fc15bb4f0c6168128"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "Runoob", "url" : "http://www.aa.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 } |
| { "_id" : ObjectId("65034808c15bb4f0c6168129"), "type" : "televison", "price" : "3999", "xinghao" : "huawei", "desc" : "xxx" } |
6.3 替换文档
将下面新文档替换ID为"6503466fc15bb4f0c6168128"
| db.class.save({ |
| "_id" : ObjectId("6503466fc15bb4f0c6168128"), |
| "title" : "MongoDB", |
| "description" : "MongoDB 是一个 Nosql 数据库", |
| "by" : "Runoob", |
| "url" : "http://www.aa.com", |
| "tags" : [ |
| "mongodb", |
| "NoSQL" |
| ], |
| "likes" : 110 |
| |
| }) |

查看当前集合class内容
| > db.class.find() |
| { "_id" : ObjectId("6503466fc15bb4f0c6168128"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "Runoob", "url" : "http://www.aa.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 } |
| { "_id" : ObjectId("65034808c15bb4f0c6168129"), "type" : "televison", "price" : "3999", "xinghao" : "huawei", "desc" : "xxx" } |
6.4 数据的查询
| > db.class.find() |
| { "_id" : ObjectId("6503466fc15bb4f0c6168128"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "Runoob", "url" : "http://www.aa.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 } |
| { "_id" : ObjectId("65034808c15bb4f0c6168129"), "type" : "televison", "price" : "3999", "xinghao" : "huawei", "desc" : "xxx" } |
| > |
| > db.class.find({"type":"televison"}) |
| { "_id" : ObjectId("65034808c15bb4f0c6168129"), "type" : "televison", "price" : "3999", "xinghao" : "huawei", "desc" : "xxx" } |
| > db.class.find().pretty() |
| { |
| "_id" : ObjectId("6503466fc15bb4f0c6168128"), |
| "title" : "MongoDB", |
| "description" : "MongoDB 是一个 Nosql 数据库", |
| "by" : "Runoob", |
| "url" : "http://www.aa.com", |
| "tags" : [ |
| "mongodb", |
| "NoSQL" |
| ], |
| "likes" : 110 |
| } |
| { |
| "_id" : ObjectId("65034808c15bb4f0c6168129"), |
| "type" : "televison", |
| "price" : "3999", |
| "xinghao" : "huawei", |
| "desc" : "xxx" |
| } |
6.5 删除集合
例如删除runoob集合。
db.runoob.drop()
6.6 删除文档
删除class集合某个文档
db.class.remove({"type":"televison"})
查看class集合内所有文档数据,ID为65034808c15bb4f0c6168129的文档已经删除。
| > db.class.find() |
| { "_id" : ObjectId("6503466fc15bb4f0c6168128"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "Runoob", "url" : "http://www.aa.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 } |
我正在参与 腾讯云开发者社区数据库专题有奖征文。