一、了解 MongoDB
之前认识了两种相同类型的缓存技术(关系型数据库)memcached 和 Redis, MongoDB是与之前两款完全不同的一个类型的缓存技术!称之为:文档型数据库!
提到文档,一个新概念JSON,MongoDB的文档类似于JSON对象!
代码语言:javascript复制JSON:JavaScript 对象表示法(JavaScript Object Notation)。
JSON 是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
来看一下JSON文档:
代码语言:javascript复制{
"employees": [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName":"Carter" }
]
}
MongoDB 特点:
- C 编写,基于分布式的,属于NoSQL的一种。
- 在NoSQL中是最像关系型数据库的 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档、数组及文档数组。
- 因为基于分布式,所以很容易扩展。
MongoDB和关系型数据库对比:
关系型数据库数据结构:
MongoDB数据结构:
总结:
文档型数据库,类似于JSON,且是分布式结构,支持横向扩展!
二、安装MongoDB
MongoDB支持yum安装,但是版本比较老,所以我们使用创建一个新的扩展源来安装。
代码语言:javascript复制cd /etc/yum.repos.d/
vim mongodb.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
--------------------------
yum list |grep mongodb //可以看到mongodb相关的rpm包
yum install -y mongodb-org
三、连接MongoDB
代码语言:javascript复制systemctl start mongod //启动服务
代码语言:javascript复制vim /etc/mongod.conf //查看配置文件
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1,192.168.59.131 # Listen to local interface only, comment to listen on all interfaces.
如上添加IP 的时候一定需要用 逗号 分开!
[[email protected] ~]# systemctl restart mongod
[[email protected] ~]# mongo --host 192.168.59.131 --port 27017
然后就可以使用配置的IP地址去连接!
- 在本机可以直接运行命令mongo进入到mongodb shell中
- 如果mongodb监听端口并不是默认的27017,则在连接的时候需要加–port 选项,例如
mongo --port 27018
- 连接远程mongodb,需要加–host,例如
mongo --host 127.0.0.1
- 如果设置了验证,则在连接的时候需要带用户名和密码
mongo -uusername -ppasswd --authenticationDatabase db //这个和MySQL挺像
四、MongoDB用户管理
代码语言:javascript复制use admin //需要切换到admin库
创建一个新的用户并指定角色和密码等!
代码语言:javascript复制db.createUser( { user: "admin", customData: {description: "superuser"}, pwd: "admin122", roles: [ { role: "root", db: "admin" } ] } )
user指定用户,customData为说明字段,可以省略,pwd为密码,roles指定用户的角色,db指定库名
再次增加一个测试用户:
> db.createUser({user:"asd",pwd:"asd9577",roles:[{role:"root",db:"admin"}]})
Successfully added user: {
"user" : "asd",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
关于 MongoDB 角色:
代码语言:javascript复制Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
列出所有用户,需要切换到admin库
代码语言:javascript复制db.system.users.find()
查看当前库下所有的用户
代码语言:javascript复制show users
删除用户
代码语言:javascript复制db.dropUser('admin')
若要用户生效,还需要编辑启动脚本
代码语言:javascript复制vim /usr/lib/systemd/system/mongod.service
在OPTIONS=后面增--auth
Environment="OPTIONS=--auth -f /etc/mongod.conf"
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart mongod
[[email protected] ~]# ps aux | grep mongod
mongod 5258 5.1 4.0 971176 40728 ? Sl 17:45 0:00 /usr/bin/mongod --auth -f /etc/mongod.conf
root 5283 0.0 0.0 112668 968 pts/0 R 17:45 0:00 grep --color=auto mongod
使用授权的用户登录格式如下:
代码语言:javascript复制mongo -u "admin" -p "asd9577" --authenticationDatabase "admin"
如果不使用账号和密码的方式再去登录就会报错:
代码语言:javascript复制> show users
2017-10-17T17:48:50.903 0800 E QUERY [thread1] Error: not authorized on admin to execute command { usersInfo: 1.0 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.getUsers@src/mongo/shell/db.js:1539:1
shellHelper.show@src/mongo/shell/utils.js:752:9
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1
可以看到受限!
创建一个账户可以同时针对两个库授权: test1用户对db1库读写,对db2库只读。
代码语言:javascript复制db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )
之所以先use db1,表示用户在 db1 库中创建,就一定要db1库验证身份,即用户的信息跟随随数据库。比如上述 test1虽然有 db2 库的读取权限,但是一定要先在db1库进行身份验证,直接访问会提示验证失败。
代码语言:javascript复制use db2
db.auth("test1", "123aaa")
但是当我I们再次使用db1 去验证那一定是可以的!
代码语言:javascript复制> db.auth("test1","123aaa")
1