MongoDB数据库的基本使用总结

MongoDB/NoSQL
233
0
0
2024-02-10
标签   MongoDB

一、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 ~]#  systemctl status mongod
● 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服务操作

  • 启动MongoDB服务
systemctl start mongod
  • 使MongoDB服务开机自启
systemctl enable mongod
  • 取消MongoDB服务开机自启
 systemctl disable mongod
  • 停止MongoDB服务systemctl stop mongodb

三、MongoDB数据库内环境检查操作

3.1 查询MongoDB版本

在MongoDB数据库内,查询当前版本。
> db.version()
5.0.21

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的用户角色与权限

  • 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 数据库验证身份,您还需在每个数据库中创建用户账户,让这些用户能够访问该数据库。
  • 创建用户管理员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://127.0.0.1:27017/?authSource=admin&compressors=disabled&gssapiServiceName=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://docs.mongodb.com/mongodb-shell/install/
================
>

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 数据的查询

  • 查询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" }
>
  • 根据条件查找数据
> 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 }

我正在参与 腾讯云开发者社区数据库专题有奖征文。