简介
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB特点
- 面向集合存储,易存储对象类型的数据
- 模式自由
- 支持动态查询
- 支持完全索引,包含内部对象
- 支持查询
- 支持复制和故障恢复
- 使用高效的二进制数据存储,包括大型对象(如视频等)
- 自动处理碎片,以支持云计算层次的扩展性
- 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言
- 文件存储格式为BSON(一种JSON的扩展)
- 可通过网络访问
MongoDB常用的数据类型
数据类型 | 描述 |
---|---|
String | 字符串,字符集UTF-8 |
Integer | 整型数值 |
Boolean | 布尔值类型(真/假) |
Double | 双精度浮点值 |
Arrays | 数组 |
Object | 用于内嵌文档 |
Null | 用于创建空值 |
Date | 日期时间 |
Binary Data | 二进制数据 |
内置数据库用户角色
1、数据库用户角色
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
2、数据库管理员角色
dbAdmin:允许用户进行索引创建、删除,查看统计或访问system.profile,但没有角色和用户管理的权限
userAdmin:提供了在当前数据库中创建和修改角色和用户的能力
dbOwner: 提供对数据库执行任何管理操作的能力。这个角色组合了readWrite、dbAdmin和userAdmin角色授予的特权。
3、集群管理角色
clusterAdmin : 提供最强大的集群管理访问。组合clusterManager、clusterMonitor和hostManager角色的能力。还提供了dropDatabase操作
clusterManager : 在集群上提供管理和监视操作。可以访问配置和本地数据库,这些数据库分别用于分片和复制
clusterMonitor : 提供对监控工具的只读访问,例如MongoDB云管理器和Ops管理器监控代理。
hostManager : 提供监视和管理服务器的能力。
4、备份恢复角色
backup : 提供备份数据所需的能力,使用MongoDB云管理器备份代理、Ops管理器备份代理或使用mongodump
restore : 提供使用mongorestore恢复数据所需的能力
5、所有数据库角色
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
6、超级用户角色
root:提供对readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、restore和backup的所有资源的访问
7、内部角色
__system : 提供对数据库中任何对象的任何操作的特权
实验环境
系统环境:CentOS7.4
Server端IP地址:192.168.100.76
MongoDB版本:3.6.7
搭建步骤
一、安装MongoDB
1、自定义yum源文件
[[email protected]_6 ~]# cd /etc/yum.repos.d/
[[email protected]_6 yum.repos.d]# mkdir bak
[[email protected]_6 yum.repos.d]# mv CentOS-* bak/ #备份yum源
[[email protected]_6 yum.repos.d]# vim local.repo
[mongodb-org]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
[[email protected]_6 ~]# yum clean all #清除yum缓存
[[email protected]_6 ~]# yum list #重新加载源
3、编辑主配置文件
[[email protected]_6 ~]# vim /etc/mongod.conf
#编辑以下参数
net: #约28行左右,指定网卡借接口
port: 27017 #监听端口(默认监听端口)
bindIp: 0.0.0.0 #监听地址(编辑地址为任意网段)
4、启动服务
[[email protected]_6 ~]# systemctl start mongod.service
[[email protected]_6 ~]# netstat -antp | grep ‘27017‘
二、开启多实例
[[email protected]_6 ~]# cp -p /etc/mongod.conf /etc/mongod2.conf
[[email protected]_6 ~]# vim /etc/mongod2.conf
#编辑以下参数
systemLog:
path: /data/logs/mongodb/mongodb2.log #约第10行,编辑日志文件路径
storage:
dbPath: /data/mongodb/mongodb2 #约第14行,编辑数据目录路径
net:
port: 27018 #约第29行,编辑监听端口
[[email protected]_6 ~]# mkdir -p /data/mongodb/mongodb2 #创建数据目录
[[email protected]_6 ~]# mkdir -p /data/logs/mongodb #创建日志目录
[[email protected]_6 ~]# touch /data/logs/mongodb/mongodb2.log #创建日志文件
[[email protected]_6 ~]# chmod 777 /data/logs/mongodb/*.log #修改目录权限
[[email protected]_6 ~]# mongod -f /etc/mongod2.conf #启动多实例
[[email protected]_6 ~]# mongo --port 27018 #连接数据库
三、基本操作
[[email protected]_6 ~]# mongo
> db.version(); #显示版本信息
3.6.7
> show dbs; #显示所有数据库
admin 0.000GB
local 0.000GB
> db.getMongo(); #显示当前数据库连接地址
connection to 127.0.0.1:27017
四、数据库常用操作
1、创建数据库
> use firstdb //注意使用"use"命令不存在会创建数据库,不建立集合又会删除**
switched to db firstdb
> db
firstdb
> show dbs //刚刚添加的"firstdb"数据库并未在数据库列表中
admin 0.000GB
config 0.000GB
local 0.000GB
> db.firstdb.insert({"name":"tom"}) //插入数据
WriteResult({ "nInserted" : 1 })
> show dbs; //插入数据之后,相应的库显示出来了
admin 0.000GB
config 0.000GB
firstdb 0.000GB
local 0.000GB
2、删除数据库
> show dbs;
admin 0.000GB
config 0.000GB
firstdb 0.000GB
local 0.000GB
> use firstdb //首先进入指定的数据库
switched to db firstdb
> db.dropDatabase() //删除进入的数据库
{ "dropped" : "firstdb", "ok" : 1 }
> show dbs; //查看"firstdb"已经被删除
admin 0.000GB
config 0.000GB
local 0.000GB
>
3、创建集合
1).普通创建集合
> use test //创建或指定相关的数据库
switched to db test
> db.createCollection("runoob") //创建指定集合"runoob"
{ "ok" : 1 }
> show collections //查看集合
runoob
2).使用关键参数创建集合
参数详解
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为true时,必须指定size参数 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。如果capped为true,也需要指定该字段 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量 |
> use test
switched to db test
> db.createCollection("mycol",{capped:true,size:6142800,max:10000}) //创建固定集合 mycol,整个集合空间大小 6142800KB,文档最大个数为10000个
{ "ok" : 1 }
3).直接插入数据,系统自动创建集合
> use test
switched to db test
> db.mycol2.insert({"name" : "tom"}) //创建集合
WriteResult({ "nInserted" : 1 })
> show collections;
mycol
mycol2
runoob
4、删除集合
> use test
switched to db test
> show collections
mycol
mycol2
runoob
> db.mycol2.drop() //删除mycol2集合
true
5、插入文档
1).直接插入数据
> use test
switched to db test
> show collections
mycol
runoob
> db.col.insert({title:‘MongoDB教程‘,description:‘MongoDB是一个Nosql数据库‘,tags: [‘mongodb‘, ‘database‘, ‘NoSQL‘]}) //插入数据
WriteResult({ "nInserted" : 1 })
> db.col.find() //查看插入数据
{ "_id" : ObjectId("5b9230733a06412f2eef4fbc"), "title" : "MongoDB教程", "description" : "MongoDB是一个Nosql数据库", "tags" : [ "mongodb", "database", "NoSQL" ] }
2).引用变量插入数据
> document=({name:‘tom‘,address:‘KunMing‘,tel:‘13811112222‘}) //将数据赋值给变量
{ "name" : "tom", "address" : "KunMing", "tel" : "13811112222" }
> typeof(document.name) //查看字段类型
string
> db.users.insert(document) //插入数据
WriteResult({ "nInserted" : 1 })
> db.users.find() //查看插入数据
{ "_id" : ObjectId("5b9231db3a06412f2eef4fbd"), "name" : "tom", "address" : "KunMing", "tel" : "13811112222" }
6、更新文档
> db.users.find().pretty()
{
"_id" : ObjectId("5b9231db3a06412f2eef4fbd"),
"name" : "tom",
"address" : "KunMing",
"tel" : "13811112222"
}
> db.users.update({‘name‘:‘tom‘},{$set:{‘name‘:‘Jack‘}}); //将"tom"改成"Jack"
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find().pretty()
{
"_id" : ObjectId("5b9231db3a06412f2eef4fbd"),
"name" : "Jack", //查看修改成功
"address" : "KunMing",
"tel" : "13811112222"
}
7、删除文档
> db.users.find()
{ "_id" : ObjectId("5b9231db3a06412f2eef4fbd"), "name" : "Jack", "address" : "KunMing", "tel" : "13811112222" }> db.users.remove({‘name‘:‘Jack‘}) //删除"name"为"Jack"这一条数据
WriteResult({ "nRemoved" : 1 })
> db.users.find()
五、数据导入与导出
1、创建测试数据
> use test
switched to db test
> for(var i=1;i<=100;i++)db.student.insert({"id":i,"name":"tom"+i}) //循环写入测试数据
WriteResult({ "nInserted" : 1 })
> db.student.count() //查看集合的条目数
100
2、导出数据
[[email protected]_6 ~]# mongoexport -d test -c student -o /opt/test_student.json
参数详解:
-d:指定数据库名称
-c:指定collection的名字
-f:指定要导出哪些列
-o:指定要导出的文件名
-q:指定导出数据的过滤条件
[[email protected]_6 ~]# ll /opt/
3、导入数据
> use test
switched to db test
> db.student.drop() //删除集合
true
>
[[email protected]_6 ~]# mongoimport -d test -c student1 --file /opt/test_student.josn #导入数据
> use test
switched to db test
> db.student1.count() //查看数据导入成功
100
>
4、条件筛选导出数据
[[email protected]_6 ~]# mongoexport -d test -c student1 -q ‘{"id":{"$eq":10}}‘ -o /opt/test_stuone.json #筛选导出"id"等于10的条目
[[email protected]_6 ~]# cat /opt/test_stuone.json
六、数据备份与恢复
1、数据备份
[[email protected]_6 ~]# mkdir /backup #创建存放备份数据目录
[[email protected]_6 ~]# mongodump -d test -o /backup/ #备份"test"数据库至backup目录下
参数详解
-h:MongoDB所在服务器IP地址
-d:需要备份的数据库实例
-o:备份的数据存放的位置
[[email protected]_6 ~]# cd /backup/test/ #进入备份目录
[[email protected]_6 test]# ls
2、数据恢复
[[email protected]_6 ~]# mongorestore -d test1 --dir=/backup/test/ #恢复数据,指定数据库为"test1"
> show dbs; //查看数据库
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
test1 0.000GB
> use test1 //进入"test1"数据库
switched to db test1
> show collections //查看集合已经导入成功
col
mycol
runoob
student
student1
users
>
七、复制数据库
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
> db.copyDatabase("test","test2","localhost") //复制数据库
{ "ok" : 1 }
> show dbs
admin 0.000GB4
config 0.000GB
local 0.000GB
test 0.000GB
test2 0.000GB
>
八、克隆集合
[[email protected]_6 ~]# mongod -f /etc/mongod2.conf #开启第二个实例
[[email protected]_6 ~]# netstat -anpt | grep -E ‘27017|27018‘
[[email protected]_6 ~]# mongo --port 27018 #登陆第二个实例
> db.runCommand({"cloneCollection":"test.users","from":"192.168.100.76:27017"})//将27017端口的集合复制到27018上
{ "ok" : 1 }
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
> use test
switched to db test
> show collections //查看复制成功
users
九、安全管理
1、添加授权用户
[[email protected]_6 ~]# mongo
> use admin
> db.createUser({user: "myUserAdmin",pwd: "abc123",roles: [{role:"userAdminAnyDatabase",db:"admin"}]}) //在admin数据库中添加具有userAdminAnyDatabase角色的用户
> exit
2、编辑实例1主配置文件
[[email protected]_6 ~]# vim /etc/mongod.conf #实例1
net:
port: 27017 //监听端口
bindIp: 0.0.0.0 //监听地址
security: //约33行,打开注释
authorization: enabled //添加认证。注意冒号后面需要空一格
3、重启服务
[[email protected]_6 ~]# mongod -f /etc/mongod.conf -shutdown #停止第一个实例
[[email protected]_6 ~]# mongod -f /etc/mongod.conf #启动第一个实例
4、登录验证
[[email protected]_6 ~]# mongo
[[email protected]_6 ~]# mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin" #在admin数据库中添加具有userAdminAnyDatabase角色的用户
> use admin
> db.auth("myUserAdmin", "abc123" )
5、进程管理
> db.currentOp() //查看当前正在运行的进程的命令
"opid" : 1580, //注意其中有一个参数是进程号
> db.killOp(1580) //结束进程
{ "info" : "attempting to kill op", "ok" : 1 }
十、MongoDB监控
> db.serverStatus() //查看数据库实例的状态信息
> db.stats() //查看当前数据库的统计信息
[[email protected]_6 ~]# vim /etc/mongod.conf httpinterface=true //3.6之后无此功能
原文地址:http://blog.51cto.com/11905606/2174179