MongoDB 入门

# 安装 mongodb 和 mongosh

## ubuntu 部署 mongodb

### 官网下载 mongodb 的 tar 包

到 官方地址 复制 tar 包的下载地址

### Ubuntu 中安装

执行命令下载 tar 包

Copy
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.7.tgz

解压

Copy
tar -zxvf mongodb-linux-x86_64-ubuntu2204-6.0.7.tgz

将解压后的文件重命名并到 /usr/local/mongodb

Copy
mv mongodb-linux-x86_64-ubuntu2204-6.0.7/ mongodb/

### 配置

在目录中创建 logs 和 data 文件夹

Copy
mkdir logs
mkdir data

在 logs 中执行

Copy
touch mongodb.log

接着进入 bin 目录下
新增一个 mongodb.conf 的配置文件

Copy
# 数据文件存放目录
dbpath = /usr/local/mongodb/data
# 日志文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log
logappend=true
# 端口
port = 27017
# 以守护程序的方式启用，即在后台运行
fork = false
# 认证模式
auth=true
# 远程连接
bind_ip=0.0.0.0

### bin 目录下启动

执行启动命令

Copy
./mongod -f mongodb.conf

后台启动只需要添加 --fork

Copy
./mongod --fork -f mongodb.conf

## 安装 mongodb shell

执行下载压缩包

Copy
wget https://downloads.mongodb.com/compass/mongosh-1.6.0-linux-x64.tgz

解压

Copy
tar -zxvf mongosh-1.6.0-linux-x64.tgz

重命名解压后的文件

Copy
mv mongosh-1.6.0-linux-x64 mongosh

在 mongosh/bin 目录下提供了 mongosh 命令 用于连接到 mongoDB 数据库服务

## 将 bin 目录添加到环境变量 path 中

目前 mongod 命令所在目录路径是 mongodb/bin ， mongosh 命令所在目录路径是 mongosh/bin ，需要将这两个路径添加到 Path 环境变量中。

执行命令，编辑环境变量

Copy
vi ~/.bashrc

在文件的最后面添加

Copy
PATH=$PATH:$HOME/bin:/usr/local/mongodb/bin:/usr/local/mongosh/bin

保存后执行命令让配置生效

Copy
source ~/.bashrc

## 启动

mongoDB 可以使用

Copy
mongodb --fork -f mongodb.conf

mongosh 直接执行

Copy
mongosh

mongosh 默认连接到 mongodb:localhost:27017

## 问题解决

### 权限问题

但是此时，在普通用户下执行插入时就报错了（root 用户下执行也是会报错），这是因为之前的配置文件中，将 auth 校验设置为 true 了

所以需要先将 auth 改为 false，然后重新启动。

Copy
ps -ef | grep mongodb

kill -9 端口号

启动后到 admin 集合下创建超级管理员账户，创建后，再把配置文件中的 auth 改为 true , 重新启动 mongo 进程进可以了。

#### 创建超级用户

Copy
>use admin

>db.createUser({user:"root",pwd:"XXXXXX",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"}]})

创建完成后，重启 mongodb ，重新 mongosh 连接

# 用户与角色

## 角色

Built-In Roles（内置角色）

Copy
数据库用户角色：read、readWrite;

数据库管理角色：dbAdmin、dbOwner、userAdmin；

集群管理角色：clusterAdmin、clusterManager、clusterMonitor、hostManager；

备份恢复角色：backup、restore；

所有数据库角色：readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase

超级用户角色：root
// 这里还有几个角色间接或直接提供了系统超级用户的访问（dbOwner 、userAdmin、userAdminAnyDatabase）

内部角色：__system

具体角色的功能

Copy
Read：允许用户读取指定数据库

readWrite：允许用户读写指定数据库

dbAdmin：允许用户在指定数据库中执行管理函数，如索引创建、删除，查看统计或访问system.profile

userAdmin：允许用户向system.users集合写入，可找指定数据库里创建、删除和管理用户

clusterAdmin：只在admin数据库可用，赋予用户所有分片和复制集相关函数的管理权限。

readAnyDatabase：只在admin数据库中可用，赋予用户所有数据库的读权限

readWriteAnyDatabase：只在admin数据库中可用，赋予用户所有数据库的读写权限

userAdminAnyDatabase：只在admin数据库可用，赋予用户所有数据库的userAdmin权限

dbAdminAnyDatabase：只在admin数据库可用，赋予用户所有数据库的dbAdmin权限。

root：只在admin数据库中可用。超级账号，超级权限

## 用户

### 创建普通用户

Copy
//切换到admin数据库
use admin

//进行auth认证，认证通过返回：1
db.auth("root","密码")

//切换或创建数据库，例：test
use test

db.createUser({user:"user",pwd:"123456",roles:[{role:"readWrite",db:"test"}]})

Copy
db.createUser({user:"testadmin",pwd:"123456",roles:[{role:"dbAdmin",db:"test_data"},{role:"readWrite",db:"test_data"},{role:"userAdmin",db:"test_data"}]})

### 查看和删除用户

Copy
#切换到admin数据库
use admin

#查看所有用户
db.system.users.find()

#删除用户 删除时需要切换到该账户所在的数据库
db.system.users.remove({user:"testadmin"})

超级管理员也可能没有删除的权限，查看其 role 中是否有删除该用户的权限。