You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
4.2 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
icon: edit
date: 2023-03-06
category:
- 系统配置
headerDepth: 5
---
# mongodb及使用
## 一、mongoDB是什么
MongoDB是一个NoSQL的非关系型数据库 ,支持海量数据存储,高性能的读写。
### 1. mongo的体系结构
![image-1678084882505](https://local.wuanwanghao.top:9000/test/test/image-1678084882505.png)
mongo中的集合相当于mysql中表的概念
mongo中的文档相当于mysql中行的概念
mongo中的域相当于mysql中字段/列的概念;
### 2. mongoDB的特点(或使用场景)
支持存储海量数据;(例如:直播中的打赏数据)
支持频繁的数据读写;(例如:游戏道具);
数据安全性不高,存在数据误差(丢失数据)
mongoDB不支持多表操作不支持事务
mongoDB使用Bson存储格式支持动态字段管理
### 3. mongoDB与mysql、redis对比
与redis对比
1. redis纯内存数据库内存不足时触发淘汰策略mongoDB使用内存加磁盘的存储策略具有高扩展性
2. mongoDB使用Bson存储格式支持动态字段管理方便扩展
与mysql对比
1. mongoDB不支持多表操作不支持事务
2. mongoDB使用Bson存储格式支持动态字段管理
查询效率对比
Redis > MongoDB > MySQL
### 4. mongoDB存储原理
![image-1678084900902](https://local.wuanwanghao.top:9000/test/test/image-1678084900902.png)
mongoDb采用内存加磁盘的方式存储数据
mongoDb支持数据分片当单一的服务器中磁盘不够用的时候还可以串联其他服务器
客户端的请求到达内存时,先在日志中记录下操作记录,然后再去操作内存;
内存中的日志每10ms向磁盘中的日志进行同步一次数据则每分钟同步一次
客户端先去内存中查询数据,内存中没有再去查询磁盘;
当客户端写入的时候,会先写入到内存中,内存中写入后请求直接返回,内存中的数据会根据同步策略同步到磁盘;
如果机器宕机在重启服务的时候会解析磁盘中的日志和磁盘中的数据进行对比将未入到磁盘中的数据写入磁盘但可能会丢失10ms的数据
## 二、使用docker安装mongo
### 1.安装
1.拉取mongo镜像
``` shell
docker pull mongo:4.4
```
2.创建mongo数据持久化目录
``` shell
mkdir -p /docker_volume/mongodb/data
```
3.运行容器
``` shell
docker run -d --name mongo -v /docker_volume/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth --bind_ip 0.0.0.0
```
auth需要密码才能访问容器服务
--bind_ip 0.0.0.0 监听从所有ip请求来的流量
相关命令行参数 请参照官方文档 [mongod](https://www.mongodb.com/docs/manual/reference/program/mongod/#cmdoption-mongod-auth)
### 2.创建用户
登录mongo容器并进入到【admin】数据库
```
docker exec -it mongo mongo admin
```
创建一个用户mongo 默认没有用户
db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});
```【user:root设置用户名为root```
```【pwd:123456设置密码为123456```
```【role:userAdminAnyDatabase只在admin数据库中可用赋予用户所有数据库的userAdmin权限```
```【db: admin可操作的数据库```
```【readWriteAnyDatabase赋予用户读写权限 ```
dbAdmin允许用户在指定数据库中执行管理函数如索引创建、删除查看统计或访问system.profile
### 3. 连接、测试
连接mongo数据库
```shell
db.auth('root', '123456')
```
测试数据库 创建集合
```shell
db.createCollection("user")
```
测试数据库,插入一条语句
```shell
db.user.insert({"name":"zhangsan","age":18})
```
测试数据库,查询刚才插入的语句
```shell
db.user.find()
```
### 4.修改密码
#### 1、首先通过以下命令登录mongodb数据库。
show dbs 查看数据库
use dbname 进入数据库
show users 查看当前数据库用户权限据。
#### 2、使用以下方法修改密码即可。
方法1
```shell
db.changeUserPassword("usertest","changepass");
```
方法2
```shell
db.updateUser("usertest",{pwd:"changepass1"})
```