## 21.26 MongoDB介绍
* 官网 www.mongodb.com, 当前最新版3.4
* 文档型数据库
* C++编写,基于分布式的,属于NoSQL的一种
* 在NoSQL中是最像关系型数据库的
* MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档、数组及文档数组。
* 关于JSON http://www.w3school.com.cn/json/index.asp
* 因为基于分布式,所以很容易扩展
### 非关系型数据库和关系型数据库对比

#### 关系型数据库数据结构

#### MongoDB数据结构

## 21.27 MongoDB安装
epel自带2.6版本的MongoDB,在此安装MongoDB v3.4,方法如下:
官方安装文档: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
基本思路:创建一个最新版本MongoDB的yum源,然后yum安装。
### 安装准备
```
[root@adailinux ~]# cd /etc/yum.repos.d/
[root@adailinux yum.repos.d]# vim mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
[root@adailinux yum.repos.d]# yum list |grep mongodb
mongodb-org.x86_64 3.4.9-1.el7 mongodb-org-3.4
mongodb-org-mongos.x86_64 3.4.9-1.el7 mongodb-org-3.4
mongodb-org-server.x86_64 3.4.9-1.el7 mongodb-org-3.4
mongodb-org-shell.x86_64 3.4.9-1.el7 mongodb-org-3.4
mongodb-org-tools.x86_64 3.4.9-1.el7 mongodb-org-3.4
```
即,安装包创建完成!
### 安装
```
[root@adailinux ~]# yum install -y mongodb-org
```
这样就安装好了,需要等待较长时间,耐心…
## 21.28 连接MongoDB
### MongoDB配置文件
```
[root@adailinux ~]# vim /etc/mongod.conf
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1,192.168.8.131
# Listen to local interface only, comment to listen on all interfaces.
##绑定多个IP时用逗号分隔
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
```
### 启动MongoDB
```
[root@adailinux ~]# systemctl start mongod
[root@adailinux ~]# ps aux |grep mongod
mongod 9258 1.8 7.2 972188 35752 ? Sl 18:16 0:00 /usr/bin/mongod -f /etc/mongod.conf
[root@adailinux ~]# netstat -lntp |grep mongo
tcp 0 0 192.168.8.131:27017 0.0.0.0:* LISTEN 9258/mongod
```
启动完成!
### 连接MongoDB
```
[root@adailinux ~]# mongo
>
```
如果不是监听本地IP和27017端口的话需要指定IP和端口:
--port : 指定端口
--host : 指定IP
如果设置了密码,则在连接时需要指定用户名和密码:
```
[root@adailinux ~]# mongo -uusername -p'passwd' --authenticationDatabase dbname
```
## 21.29 MongoDB用户管理
```
[root@adailinux ~]# mongo
切换到admin库:
> use admin
switched to db admin
创建用户并设定密码:
> db.createUser( { user: "admin", customData: {description: "superuser"}, pwd: "admin122", roles: [ { role: "root", db: "admin" } ] } )
##用户名:admin;密码:admin122
##user指定用户,customData为说明字段,可以省略,pwd为密码,roles指定用户的角色,db指定库名
列出所有用户:
> db.system.users.find()
##执行此操作前必须先切换到admin库
查看当前库下所有用户:
> show users
删除用户:
> db.createUser({user:"adai",pwd:"123456",roles:[{role:"read",db:"testdb"}]})
##先添加一个用户
> show users
"_id" : "admin.adai",
"_id" : "admin.admin",
删除:
> db.dropUser('adai')
true
> show users;
"_id" : "admin.admin"
```
如果要用户生效,还需要编辑启动脚本:
```
[root@adailinux ~]# vim /usr/lib/systemd/system/mongod.service
Environment="OPTIONS=--auth -f /etc/mongod.conf"
#在options后面添加--auth参数
重载服务:
[root@adailinux ~]# systemctl daemon-reload
[root@adailinux ~]# systemctl restart mongod
[root@adailinux ~]# ps aux |grep mongod
mongod 9535 19.0 7.1 971164 35264 ? Sl 18:46 0:00 /usr/bin/mongod --auth -f /etc/mongod.conf
```
再次连接MongoDB:
```
[root@adailinux ~]# mongo --host 127.0.0.1 --port 27017 -u"admin" -p"admin122" --authenticationDatabase "admin"
```
**注意:** 创建用户的时候要针对一个库,登录的时候也需要指定对应的库。
### 应用
```
> db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )
#test1用户对db1库读写,对db2库只读。
#之所以先use db1,表示用户在 db1 库中创建,就一定要db1库验证身份,即用户的信息跟随随数据库。
#比如上述 test1虽然有 db2 库的读取权限,但是一定要先在db1库进行身份验证,直接访问会提示验证失败。
认证:
> db.auth('test1','123aaa')
1
##在哪个库下创建的用户就在哪个库进行认证操作
认证完成之后就可以使用相应的库了:
> use db2
```
### 常用操作
* db.version() //查看版本
* use userdb //如果库存在就切换,不存在就创建
* show dbs //查看库,此时userdb并没有出现,这是因为该库是空的,还没有任何集合,只需要创建一个集合就能看到了
* db.createCollection('clo1') //创建集合clo1,在当前库下面创建
* db.dropDatabase() //删除当前库,要想删除某个库,必须切换到那个库下
* db.stats() //查看当前库的信息
* db.serverStatus() //查看mongodb服务器的状态
### MongoDB用户角色(roles)
* Read:允许用户读取指定数据库
* readWrite:允许用户读写指定数据库
* dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
* userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
* clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
* readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
* readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
* userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
* dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
* root:只在admin数据库中可用。超级账号,超级权限
编辑回复