什么是mongodb?
mondgodb是由c++语言编写的,是一个基于分布式文件存储的开源数据库系统
在高负载的情况下,添加更多的节点,可以保证服务器新能
mongodb指在web应用的场景提供可扩展的搞性能数据存储解决方案
mongodb将数据存储为一个文档,数据结构由键值(key=>value)对组成,MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。主要特点
主要特点
- MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
- 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
- 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
- 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
- Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
- Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
- Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
- GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- MongoDB安装简单。
历史
- 2007年10月,MongoDB由10gen团队所发展。2009年2月首度推出。
- 2012年05月23日,MongoDB2.1 开发分支发布了! 该版本采用全新架构,包含诸多增强。
- 2012年06月06日,MongoDB 2.0.6 发布,分布式文档数据库。
- 2013年04月23日,MongoDB 2.4.3 发布,此版本包括了一些性能优化,功能增强以及bug修复。
- 2013年08月20日,MongoDB 2.4.6 发布。
- 2013年11月01日,MongoDB 2.4.8 发布。
- ……
mongodb官网,地址为:https://www.mongodb.com/download-center#community。
部署
安装依赖包
sudo yum install libcurl openssl
[root@localhost ~]# wget https://fastdl.mongodb.org/linux/mongodb-shell-linux-s390x-rhel72-5.0.2.tgz
解压
[root@localhost ~]#tar -zxvf mongodb-linux-x86_64-rhel80-5.0.2.tgz -C /usr/local/
[root@localhost ~]# mv /usr/local/mongodb-linux-x86_64-rhel80-5.0.2/ /usr/local/mongodb
创建数据/日志目录
创建数据存放目录
[root@localhost mongodb]# mkdir -p /usr/local/mongodb/data/db
创建日志存放目录
[root@localhost mongodb]# mkdir -p /usr/local/mongodb/logs
创建日志记录文件
[root@localhost mongodb]# touch /usr/local/mongodb/logs/mongodb.log
前台启动
mongodb的默认启动方式为前台启动,所谓的前台启动就是mongodb启动的进程会占用当前的终端端口
bin/mongod --dbpath /usr/local/mongodb/data/db --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0
--dbpath:指定数据文件存放目录
--logpath;指定日志文件,注意是指定文件不是目录
--logappend; 使用追加的方式记录日志
--port :指定端口,默认为27017
--bind_ip: 绑定服务ip,若绑定127.0.0.1.则只能本机访问,默认为本机地址
后台启动
所谓的后台启动就是以守护进程方式启动mongodb,命令中添加 --fork 即可
bin/mongod --dbpath /usr/local/mongodb/data/db --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork
结束 命令添加 ---shutdown
bin/mongod --dbpath /usr/local/mongodb/data/db --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork --shutdown
用过命令启动的方式并不适合管理,毕竟每次输入命令都需要考虑各参数的配置,我们可以用过配置文件来配置启动参数,然后通过指定配置文件方式启动服务,这样在管理mongodb上就比较方便
配置文件
在bin 目录下增加一个mongodb.conf配置文件
#数据文件存放目录
dbpath = /usr/local/mongodb/data/db
#日志文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log
#以追加的方式记录日志
logappend = true
#端口默认为27017
port = 27017
#对访问ip地址不做限制,默认为本机地址
bind_ip = 0.0.0.0
#以守护进程的方式启动,即在后台运行
fork = true
启动
[root@localhost mongodb]# bin/mongod -f bin/mongodb.conf
结束
[root@localhost mongodb]# bin/mongod -f bin/mongodb.conf -shutdown
环境变量
vim /etc/profile
添加环境变量
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$JAVA_HOME/bin:$MONGODB_HOME/bin
然后source /etc/profile 重新加载系统环境变量,这样在系统任目录下造作mongodb
启动
mongod -f /usr/local/mongodb//bin/mongodb.conf
权限列表
权限 | 说明 |
Read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
userAdmin | 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 |
readAnyDatabase: | 只在admin数据库中可用,赋予用户所有数据库的读权限 |
readWriteAnyDatabase: | 只在admin数据库中可用,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase: | 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 |
dbAdminAnyDatabase: | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 |
root | 只在admin数据库中可用。超级账号,超级权限 |
创建管理用户
mongodb有一个用户管理机制,简单的描述为管理用户组,这个组的用户是专门为管理普通用户而设的,暂且称之为管理员,
管理员通常没有数据库的读写权限,只有操作用户的权限,我们只需要赋予管理员
userAdminAnyDatabase
角色即可,另外管理员账户必须在admin数据库下创建
由于用户被创建在那个数据库下,就只能在那个数据库登录,所以吧所有的用户都创建在admin数据库下,这样我们切换数据库时就不需要频繁的进行登录
先 use admin 切换至admin 数据库进行登录,登陆后再 use 切换其他的数据库进行操作即可,第二次的 use 就不需要再次登录,mongodb 设定 use 第二个数据库时如果登录用户权限比较高就可以直接操作第二个数据库,而不需要登录
创建管理用户
在mongodb中可以使用 db.createUser({用户信息}) 函数创建用户
user:用户名
pwd:密码
customData:存放用户相关自定义数据,该属性也可以忽略
roles:数组类型,配置用户的权限
>db.createUser({user:"uaad",pwd:"uaad",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
重启服务
关闭服务
mongod -f /usr/local/mongodb//bin/mongodb.conf --shutdown
然后在配置文件添加身份功能
#数据文件存放目录
dbpath = /usr/local/mongodb/data/db
#日志文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log
#以追加的方式记录日志
logappend = true
#端口默认为27017
port = 27017
#对访问ip地址不做限制,默认为本机地址
bind_ip = 0.0.0.0
#以守护进程的方式启动,即在后台运行
fork = true
#开启身份认证
auth = true
~
启动服务
mongod -f /usr/local/mongodb//bin/mongodb.conf
登录mongodb
需要切换到 uer admin
> use admin
switched to db admin
> db.auth("uaad","uaad")
1
>
返回1 代表成功
普通用户创建
创建一个读写权限用户
> use test
switched to db test
> db.createUser({user:"testuser",pwd:"123456",roles:[{role:"readWrite",db:"test"}]})
Successfully added user: {
"user" : "testuser",
"roles" : [
{
"role" : "readWrite",
"db" : "test"
}
]
}
>
身份验证
> use test
switched to db test
> db.auth("testuser","123456")
1
>
更新用户
如果我们需要对已存在的用户进行角色修改,可以使用
db.updateUser()
函数来更新用户角色,注意,执行该函数需要当前用户具有 userAdmin 或 userAdminAnyDatabase 或root 角色
db.updateAdmin("用户名",{"roles":[{"role":"角色名称",db:"数据库"},{"更新项2":"更新内容"}]})
给已创建的 uaad 用户添加 readWriteAnyDatabase 和 dbAdminAnyDatabase 权限
实例
db.updateUser("uaad",{"roles":[{"role":"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]})
show users
{
"_id" : "admin.uaad",
"userId" : UUID("0efedfaa-333b-4c9e-a123-80e65b6a0937"),
"user" : "uaad",
"db" : "admin",
"roles" : [
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
},
{
"role" : "dbAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
更改密码
更改用户密码有一下两个方式,更新密码是需要切换到改用户所在的数据库,注意:需要使用具有 userAdmin 或 userAdminAuyDatabase 或 root 角色的用户执行:
使用
db.updateUser("用户名",{"pwd":"新密码"})函数更新密码
db.changeUserpassword("用户名","新密码") 函数更新密码
db.updateUser("uaad",{"pwd":"4455"})
> use admin
switched to db admin
> db.auth("uaad","4455")
1