Mongodb数据库
接下来的课程我们可能会用到Mongodb,这里呢就随便入个门。
- 相关链接:
- 是否收费
社区版本免费,官方提供的服务收费
- NoSql,非关系型数据库
相对于Mysql,Orcel这些关系型数据库来说,Mongodb是非关系型数据库。
- 官网吹的牛逼
MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. No database makes you more productive.
既然这么牛逼,我们打算用在什么地方呢?
我打算用在评论上,用在点赞上。
安装
不安装,可以直接使用官方提供的免费版本。
链接地址:
自行安装下载地址:
使用docker床架,我这里给出compose,同学们自行修改路径和版本
version: '3.1'
services:
mongo:
container_name: sob-mongodb
image: mongo:4.4.14
restart: always
ports:
- 27017:27017
volumes:
- /home/hdc/docker/test/mongodb/db:/data/db # 挂载数据目录
- /home/hdc/docker/test/mongodb/log:/var/log/mongodb # 挂载日志目录
- /home/hdc/docker/test/mongodb/config:/etc/mongo # 挂载配置目录
这里头,就不重点安装了,主要是学习增删改查。
客户端
这里我直接使用官方的客户端,mongodb compass
下载地址:
https://www.mongodb.com/products/compass
Mongodb与Mysql对比
常用的指令
我们在学习mysql的时候,我们使用sql语句。
我们使用mongodb也是一样,当然,也可以使用sql,不过我们mongodb compass这个客户端不支持。
操作库的指令
- 创建数据库
user dbName;
如果有这个库,那么就是切换到这个库,如果没有这个库,那么就创建这个库。
- 查看当前使用的库
db;
创建数据库
use dbName;
比如说,创建一个叫sob-comment的库
use sob-comment;
查看数据库列表
show dbs;
如果只是use dbName创建,里面没有集合(表),是不会展示出来的。
use sob-comment;
'switched to db sob-comment'
show dbs;
admin 344 kB
local 2.47 GB
所以,以上示例看不到咯,至于怎么创建集合(表)我们稍后再看。跟着来练习吧,把这些命令都敲一次,你就懂了。
查看当前使用的是什么数据库
db;
比如说:
db;
sob-comment
删除数据库
db.dropdatabases();
我们把前面创建的sob-comment删除
db.dropDatabase();
{ ok: 1, dropped: 'sob-comment' }
集合操作
集合相当于Mysql的table(表)。我们就会涉及到
集合的创建
db.createCollection(name,option);
name是表的名称,集合的名称。option是选项
option选项
比如说我们现在使用sob_comment表,然后在里面创建集合article_comment
集合查看
查看集合简单吧,前面我们查看数据库是show db;
查看集合,也是同理的
show collections;
集合删除
前面我们删除数据库是db.dropdatabases();
估计你已经想到了如何删除集合了吧。
db.集合名称.drop();
比如说我们把前面创建的article_comment删除掉
内容增删改查
crud是常见的操作,我们看看mongodb的增删改查如何操作。
插入文档(document)
插入文档,如查是插入一条记录,我们可以使用
db.collection.insertOne();
格式类似于Json,但其实是BSON
BSON是binary json的简称。
可以稍微看一下数据类型
比如说我插入一条下载记录:
然后顺便查一下
这个查询是无条件查询的,也就是找出所有来了。
我们多插入几个数据,后面用于查询。假如我一次插入多个呢?
这样子就插入了。
更新文档
- 根据条件更新
- 根据Id更新save(3.2以下的版本,以上的版本没有save了)
如果是条件更新的话,我们update,如果是直接save,保存,如果ID一样就更新,不一样就入库。
比如说我修改前:
修改后的下载数量
删除文档
语法:
db.collection.deleteMany()
db.collection.deleteOne()
条件那是很灵活的呀,是吧。
比如说我根据ID删除
这样就删除成功了,所以删除很简单。重点是查询,我们要根据各种条件进行查询,灵活使用。
查找文档
相关的方法
- db.collection.find() 查找文档
- db.collection.findAndModify() 修改并且返回文档,但是返回的内容是旧的,不是此次更改的
- db.collection.findOne() 查询一个文档,如果有多个的话,就会返回第一个
- db.collection.findOneAndDelete() 同样的道理,返回删除的文档
- db.collection.findOneAndReplace() 同样的道理
- db.collection.findOneAndUpdate() 同样的道理,注意返回的都是旧的值,不是后面操作后的记录
这些内容,我们了解一下就好,毕竟后面到项目中我们是以代码的方式去调用,而不是查询语句/脚本
我们随便查询几个,意思一下吧。
比如说我要查询某个ID的内容
比如说我要查询下载数量多于50的内容
条件操作符可以看看这个:
这些都特别简单,符合程序员的习惯。
数据查询离不开的就是分页了
两个关键字:limit和skip。相当于我们使用mysql的limit size,skip offset。
跳过偏移量,然后限制数量。
假如我们每一页的数据有30条,查询第一页的数据是
limit 30,skip 0
第二页的数据是
limit 30 skip 30
第三页
limit 30 skip 60
....
到这里,大家应该明白了吧。
我们来试试看吧
总共5条数据,第一页数据查询
第二页数据查询
第三页数据,可以看出,只有一条数据了
说完分页,那就说一下排序吧,这也是很常用的
关键方法:sort(key:排序方式)
key就是字段啦,排序方式有1和-1,1表是升序(ASC),-1表示降序(DESC)
比如说我们按下载量来排序
降序:
升序:
到这里,我们的查询就差不多了。其他的话,后面看我写的代码来操作数据库吧。
账号安全权限管理
我曾经被黑客端口扫描删除我的数据勒索比特币的
- Enable Access Control and Enforce Authentication:开启访问控制,强制必须认证
- Configure Role-Based Access Control 配置角色访问控制
- Encrypt Communication (TLS/SSL) 加密通讯
- Encrypt and Protect Data 加密保护数据
- Limit Network Exposure 限制网络暴露,比如说防火墙度,端口关闭,只允许内网访问之类的
- Audit System Activity 稽查系统的访问记录
- Run MongoDB with a Dedicated User 使用专用的账号进行使用
- Run MongoDB with Secure Configuration Options 开启安全配置项
RBAC
通过角色来控制访问,默认是不开启的
You can enable authorization using the --auth or the security.authorization setting.
可以通过--auth 或者修改配置来开启
前面跟大家提的docker-compose来创建mongodb
加多一个command
version: '3.1'
services:
mongo:
container_name: sob-mongodb
image: mongo:4.4.14
restart: always
ports:
- 27017:27017
volumes:
- /home/hdc/docker/test/mongodb/db:/data/db # 挂载数据目录
- /home/hdc/docker/test/mongodb/log:/var/log/mongodb # 挂载日志目录
- /home/hdc/docker/test/mongodb/config:/etc/mongo # 挂载配置目录
command: mongod --auth
这里面解释一下RBAC,基于角色的权限控制,也就是角色跟权限的关系,用户跟角色的关系,用户因为自己是某个角色而有某些权限。
角色分类如下:
具体什么角色有什么权限,大家可以访问这个连接
https://www.mongodb.com/docs/manual/reference/built-in-roles/#database-user-roles
当然,也可以自己去创建角色,定义那可以访问的资源和动作即可。
我们先创建一个超级管理员,再通过超级管理员去创建其他的用户
- 切换到admin库
use admin
创建root用户
当我们docker-compose down
以后,修改docker-compose.yaml文件如下:
version: '3.1'
services:
mongo:
container_name: sob-mongodb
image: mongo:4.4.14
restart: always
ports:
- 27017:27017
volumes:
- /home/hdc/docker/test/mongodb/db:/data/db # 挂载数据目录
- /home/hdc/docker/test/mongodb/log:/var/log/mongodb # 挂载日志目录
- /home/hdc/docker/test/mongodb/config:/etc/mongo # 挂载配置目录
command: mongod --auth
开启权限认证
我再次登录就这样子了:
到这里我们的root用户就创建好了,可以通过这个账号去创建其他账号
登录的时候,如果你跟我的客户端一样,这样子输入:
就可以登录了,如果是命令行窗口
user admin
db.auth("root", "12345" )
接下来我们创建一个读写的用户权限,然后登录这个账号去使用。
- 切换到sob_content数据库
user sob_content
创建用户
db.createUser(
{
user:'sob-content-rw',
pwd:'12345',
roles:[
{role:"readWrite",db:"sob_content"}
]
}
)
查看一下用户
okay了,这篇文章就到这里吧,后面我再写一篇集成到我们的web项目上。
最后也同样重要的
数据备份和恢复
直接两个命令完事:
- mongodump
- mongorestore
注意:默认什么都不写,输出的文件是dump,在恢复的时候也什么都不要写,在dump父目录下执行,里面包含了所有的备份的了。
至于什么host参数之类的,你自己登录进去执行,备份好了,再拷贝出来即可。