NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库(相对于关系型数据库RDBMS)。这类数据库主要有这些特色:非关系型的、分布式的、开源的、水平可扩展的。php
NOSQL数据库相对于关系型数据库主要解决的问题包括:vue
l 对数据库高并发读写的需求(High performance)git
l 对海量数据的高效率储存和访问的需求(Huge Storage)github
l 对数据库的高扩展性和高可用性的需求(High Scalability&&High vailability)正则表达式
mongoDB是一种开源的文档数据库系统,开发语言为C++。它提供了一种高效的面向文档的存储结构,同时支持经过MapReduce程序来处理所存储的文档;它的扩展性很好,并且支持自动分区。Mapreduce能够用来实现数据聚合。它的数据以BSON(二进制JSON)格式存储,在存储结构上支持动态schema,而且容许动态查询。和RDBMS的SQL查询不一样,Mongo查询语言以JSON表示。mongodb
MongoDB是一个面向集合的,模式自由的文档型数据库。数据库
l 面向集合(Collenction-Orented),是指数据被分组存储在数据集中,每一个集合在数据库中都有一个惟一的标识名,而且能够包含无限数目的文档。相似关系型数据库(RDBMS)里的表(table),不一样的是它不须要定义任何模式(schema)。json
l 模式自由(schema-free),意味着对于存储在MongoDB 数据库中的文件,咱们不须要知道它的任何结构定义。windows
l 文档型,存储的数据是键-值对的集合,键是字符串,值能够是数据类型集合里的任意类型, 这种数据格式被称做 “BSON” 即 “Binary Serialized dOcumentNotation.”数组
² MongoDB 的文档(document),至关于关系数据库中的一行记录。
² 多个文档组成一个集合(collection),至关于关系数据库的表。
² 多个集合(collection),逻辑上组织在一块儿,就是数据库(database)。
² 一个MongoDB 实例支持多个数据库(database)。
逻辑结构对比 |
|
MongoDB |
SQL |
文档(document) |
行(row) |
集合(collection) |
表(table) |
数据库(database) |
数据库(database) |
数据库的安装很简单,一路next便可。
数据库的启动:默认端口27017,默认HTTP端口28017
(在环境变量中建立path路径C:\Program Files\MongoDB\Server\3.2\bin
,这样能够在C:\workspace
路径下命令行打开,不用输储存数据路径)
l 命令行方式启动
在安装路径bin
目录下
下打开命令行,输入下列语句:
C:\Program Files\MongoDB\Server\3.2\bin> mongod – dbpath C:\workspace\database
|
l 配置文件打开:
通常数据库启动时会有不少参数,为了方便,能够把配置参数放入配置文件而后打开。
dbpath = C:\workspace\database
C:\Program Files\MongoDB\Server\3.2\bin>mongod -f mongodb.cnf
|
l Daemon方式打开(只能在Linux中使用,咱们使用建立window服务方法代替)
(Daemon程序是一直运行的服务器程序,被称为守护进程,一般做为系统服务在后台运行,没有终端,不能和前台交互,在系统开启时启动在系统关闭后关闭)
在上两种方式中都须要打开一个命令行窗口,一旦窗口关闭,服务随之中止。因此为了使服务在窗口关闭以后能继续使用,咱们能够添加一个fork参数。须要注意的是在添加fork参数的同时应该添加logpath参数,这是强制性的。
C:\Program Files\MongoDB\Server\3.2\bin>mongod – dbpath C:\workspace\database – fork – logpath C:\workspace\database\log\r3.log
|
同上文标注的同样,这种方法实际上只能在Linux系统中使用,windows系统中没法使用这种方法,可是做为一种变通,咱们能够将mongoDB做为windows服务来启动。
方法以下:
1.
首先在C:\workspace
路径下建立
database
和
log
文件夹,在
log
文件夹下建立
mongo.log
文件
C:\Program Files\MongoDB\Server\3.2\bin> mongod -dbpath c:\workspace\database --logpath c:\workspace\log\mongo.log --install --serviceName "MongoDB"
|
C:\Program Files\MongoDB\Server\3.2\bin>net start mongodb
|
能够看到命令行中打印出来mongoDB服务已经启动成功。
数据库的关闭:
若是使用的是前两中的数据库启动方法
b.shutdownServer()
C:\Program Files\MongoDB\Server\3.2\bin> db.shutdownServer()
|
使用windows服务启动的方法
|
|
访问控制通常是考虑到安全方面的因素,在开发环境中一般不用设置,但在生产环境中须要仔细考虑。访问控制包含三个方面:IP绑定,设置监听端口,使用用户名和口令登录
l 绑定IP内网地址
添加一个bind_ip参数便可实现绑定
|
在绑定内网后,客户端访问时必须输入服务端的ip,不然报错,如
|
l 设置监听端口
官方默认的端口为27017,为了不恶意链接,能够修改端口,添加-port参数
|
一样客户端在访问时须要添加端口号
|
l 使用用户名和密码登陆
在服务端启动时添加auth参数便可开启登录验证模块
|
可是,若是咱们的admin.system.users中没有添加任何用户时,登录验证模块是没有用的,直到咱们添加了一个用户。
|
这时,咱们输入命令查看验证
|
这时若是咱们若是想操做数据库就须要输入用户名和密码了
|
下面的全部操做都须要在启动mongoDB服务的状况下进行,同时这些操做均可以使用图形化工具运行,这里使用的是robomongo工具。
若是咱们想进入数据库后台管理部分,咱们须要进入bin目录下,打开命令行输入mongo命令:
|
命令行会提醒connect to本地数据库中的test数据库。
假设咱们建立一个名为Sample的数据库,输入use Sample
命令
|
咱们可使用show dbs命令查看全部的数据库
|
这时并无发现咱们新建的数据库,这是由于新建的数据库没有数据,咱们须要向里面插入数据才会显示,咱们插入一段数据:
|
而后在show dbs命令下就能看到咱们新建的数据库了
同时,若是咱们须要切换数据库,咱们也可使用use+数据库名的命令
若是咱们想要删除这个数据库,咱们可使用db.dropDatabase()命令
|
|
|
注意事项:有些数据库的名称是保留的,能够直接访问
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承全部数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,好比列出全部的数据库或者关闭服务器。
local: 这个数据永远不会被复制,能够用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
假如咱们对Sample数据库进行增删改查的操做,首先使用use命令定位到该数据库。
l
文档的插入:db.Sample.insert
(),括号里面是插入的内容
|
也能够先用变量定义文档内容,而后直接插入,如:
>document = {title:
”
Sample
”
}
>db.Sample.insert(document)
l
文档的查看:db.Sample.find()
|
这个方法返回的是一串非结构化的数据
一般咱们可使用db
.Sample.find().pretty()
方法来返回结构化数据
在
find
方法里面能够插入参数来做为查找条件
.
1.
AND条件:db.Sample.find(
{key1:value1,key2:value2}
)
.pretty()
2.
OR条件:db.Sample.find(
{$or:{key1:value1,key2:value2} }
)
.pretty()
3.
ANG
和
OR
条件同时使用:
db.Sample.find(
{
key1:value1,
$or:{key1:value1,key2:value2}
}
)
.pretty()
l 文档的更新:
1. 使用update方法: db.Sample.update(),前面的是查询的条件,后面的是替换的内容
|
Update()函数主要是用于已经存在数据的更新,下面介绍了他的参数及各个参数的做用。
db.
Sample
.update(
<query>,
//
查询条件
<update>,
//
更新的对象及操做符
{
upsert: <boolean>,
//
可选
true
或
false
,若是值不存在判断是否插入
multi: <boolean>,
//
可选
true
或
false
,默认为
false
,只更新找到的第一个记录,
true
为更新找到的所有记录
writeConcern: <document>
//
可选
抛出异常的级别
}
)
2. 使用save()方法经过传入新的文档来替代原有文档
|
l 文档的删除操做
建议:在执行删除操做前先用find()方法来判断条件是否正确
使用remove()方法:
|
db.collection.remove(
<query>,
//
查询条件
{
justOne: <boolean>,
//
可选,
true
为只删除一条数据
writeConcern: <document>
//
可选,抛出异常的级别
}
)
3.4
操做符与
limit
、
skip
方法
数据库的操做符包括条件操做符和
$type
操做符
l
条件操做符
|
|
|
|
|
|
|
|
|
|
|
|
使用方法以下:
查找
number
值大于
100
的文档
|
查找
number
值大于
100
小于
200
的文档
|
l
$type
操做符
此方法是根据
BSON
数据格式来检索集合中匹配的数据,格式以下:
|
$type
的值是跟表中类型对应的数字。以下
类型 |
数字 |
备注 |
Double |
1 |
|
String |
2 |
|
Object |
3 |
|
Array |
4 |
|
Binary data |
5 |
|
Undefined |
6 |
已废弃。 |
Object id |
7 |
|
Boolean |
8 |
|
Date |
9 |
|
Null |
10 |
|
Regular Expression |
11 |
|
JavaScript |
13 |
|
Symbol |
14 |
|
JavaScript (with scope) |
15 |
|
32-bit integer |
16 |
|
Timestamp |
17 |
|
64-bit integer |
18 |
|
Min key |
255 |
Query with -1. |
Max key |
127 |
|
类型 |
数字 |
备注 |
Double |
1 |
|
String |
2 |
|
Object |
3 |
|
Array |
4 |
|
Binary data |
5 |
|
Undefined |
6 |
已废弃。 |
Object id |
7 |
|
Boolean |
8 |
|
Date |
9 |
|
Null |
10 |
|
Regular Expression |
11 |
|
JavaScript |
13 |
|
Symbol |
14 |
|
JavaScript (with scope) |
15 |
|
32-bit integer |
16 |
|
Timestamp |
17 |
|
64-bit integer |
18 |
|
Min key |
255 |
Query with -1. |
Max key |
127 |
|
l
L
imit()
方法:限制查找到数据的个数
|
限制查找到数据的值为三个
l
S
kip()
方法:跳过制定数量的数据
|
查找到的数据跳过
3
个
l
$exists
方法
:
查找字段是否存在
|
这种方法能够用来判断数据值为
null
仍是不存在。例如查找
rollbackTime
类的值为
null
的文档
|
其中
$in
为查找内容
(include
的缩写
)
,必须是数组
l
$mod
方法:取模运算
|
查找
number
中模
5
为
0
的值
l
$ne
方法:不等于
|
查找
number
中不等于
11
的值
l
$in
方法:包含
|
查找
number
中等于
11,12
的值
$nin
方法是一样的用法,意为不包含
l
$size
方法:数组元素的格式
|
查找
something
中数组长度为
3
的项
l
对指定字段进行排序
|
根据
number
字段进行排序,
1
表明正序,
-1
表明倒序
3.5
正则表达式匹配
Mongo
DB
数据库的查询用到的是
js
的语法,因此可使用正则表达式进行匹配
|
查找
reason
中不以
h
开头的项
3.6
数据库的索引和聚合
l
索引
(
涉及
性能优化
部分
)
索引是一种特殊的数据结构,存在一个易于读取的数据结构中,它是对数据库中一个或多个值进行排序的一种结构,建立索引的格式以下:
|
K
ey
为要建立的索引字段,
1
表明的是按升序建立
,2
表明降序建立
Parameter |
Type |
Description |
background |
Boolean |
建索引过程会阻塞其它数据库操做,background可指定之后台方式建立索引,即增长 "background" 可选参数。 "background" 默认值为false。 |
unique |
Boolean |
创建的索引是否惟一。指定为true建立惟一索引。默认值为false. |
name |
string |
索引的名称。若是未指定,MongoDB的经过链接索引的字段名和排序顺序生成一个索引名称。 |
dropDups |
Boolean |
在创建惟一索引时是否删除重复记录,指定 true 建立惟一索引。默认值为 false. |
sparse |
Boolean |
对文档中不存在的字段数据不启用索引;这个参数须要特别注意,若是设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds |
integer |
指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v |
index version |
索引的版本号。默认的索引版本取决于mongod建立索引时运行的版本。 |
weights |
document |
索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其余索引字段的得分权重。 |
default_language |
string |
对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override |
string |
对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
例如咱们建立一个索引
|
若是咱们想在后台建立索引的话,
只须要加个参数
background:true
|
查看已建立的索引
|
l
数据库聚合方法(
mapReduce,
进行并行统计
)
聚合的方法主要是用来处理数据(如求平均值,求和等)
,
并返回处理结果
|
这个方法里面使用了管道的概念,即将当前命令的结果做为下个命令的参数
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
聚合框架中经常使用的几个操做:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
例如:
|
其中聚合操做先匹配
number
值大于
5
小于
16
,在得出的结果中跳过第一个,执行下面的修改文档结构工做
3.7
其余操做l Count查询记录的条数
在find后面加上count方法能够显示查找到的数据的个数,好比
|
l Skip能够用来限制返回记录的起点
|
表示查询到的数据跳过两条,显示三条
l 查看活动进程,了解系统正在干什么
|
显示结果中参数的含义:
Opid |
操做进程号 |
Op |
操做类型(查询,更新等) |
Ns |
命名空间,指操做对象 |
Query |
显示查询操做中的具体内容 |
lockType |
指明是读锁仍是写锁 |
l 结束进程
|
1234为opid
MongoDB支持储存过程,而且能够在储存过程当中自定义处理数据,使用的是JavaScript语法。数据库的存储过程是在db.system.js表里面的。方法以下:
|
这里添加了一个get
_counts
的方法,value的值就是方法的具体内容,可使用find方法查看过程是否被储存
|
|
因为MongoDB中BSON对象的大小是有限制的,因此采用GridFS规范来将一个大文件分隔成多个小文件,使得数据库能够存储视频,高清图片之类的大文件。这个规范支持Java,Perl,PHP,Python,Ruby等程序
GridFS使用两个表来存储数据:
为保证多个GridFS命名为一个单一的数据库,文件和块都有一个前缀,默认为fs,因此任何的GridFS存储都会包括fs.files和fs.chunks。前缀fs能够被修改。
咱们以存入一个pdf文档为例,
|
-d参数指定的是数据库名称,若是没有,会自动增长一个名为test的数据库。
咱们能够查看一下数据库中有哪些GridFS文件
|
同时也可使用find命令查看文件内容
|
将大批量的工做分解(MAP)执行,再将结果合并(reduce)成最终的结果。能够用来构建大型的复杂的聚合查询
它命令的基本语法是:
>db.collection.mapReduce(
function() {emit(key,value);}, //map
函数
function(key,values) {return reduceFunction}, //reduce
函数
{
out: collection,
//
统计结果存放集合,不指定则使用临时集合
query: document,
//
筛选条件
sort: document,
//
排序函数
limit: number
//
限制发往
map
函数的文档数量
}
)
例如:咱们如今要找到
number
值相同的
_id
。
1.
首先写
map
函数
|
其中
_id
是要统计的数据,
number
为分组的依据,
map
函数实现的是分组功能
2.
编写
reduce
函数
|
这里
reduce
函数处理分组后的数据
3.
编写
finalize
函数
|
f
函数用来作最后的处理
4.
运行函数
|
5.
使用
find
函数来查询处理后的结果
|
结果参数:
result:储存结果的collection的名字,这是个临时集合,MapReduce的链接关闭后自动就被删除了。
timeMillis:执行花费的时间,毫秒为单位
input:知足条件被发送到map函数的文档个数
emit:在map函数中emit被调用的次数,也就是全部集合中的数据总量
ouput:结果集合中的文档个数(count对调试很是有帮助)
ok:是否成功,成功为1
MongoDB数据库暗转目录下有几个工具能够进行导入导出及备份恢复的功能。
包括:
mongo.exe 客户端程序,链接MongoDB
mongod.exe 服务端程序,启动MongoDB
mongo.exe 备份程序
mongoexport.exe 数据导出程序
mongofiles.exe GridFS工具,内建的分布式文件系统
mongostat.exe 状态监测工具,固定时间获取数据库的运行状态。
mongotop.exe 默认返回每一个集合每一秒读入写出的状态
mongoimport.exe 数据导入程序
mongorestore.exe 数据恢复程序
mongos.exe 数据分片程序,支持数据的横向扩展
mongodump.exe 备份程序
bsondump.exe 用于将导出的bson格式转变成json格式
mongoperf.exe 独立检查数据库I/O性能的工具
MongoDB有不少的GUI管理工具:
l MongoVUE 主页:http://www.mongovue.com/
l RockMongo 主页:http://code.google.com/p/rock-php/
l MongoHub 主页:https://github.com/bububa/MongoHub
l Robomongo 主页:https://robomongo.org/
我用的是robomongo
在mongoDB中有两种自带的监控工具来监控数据库的运行状况
l 工具mongostat
间隔固定时间获取数据库当前的运行状态
|
l 工具mongotop
获取每个集合每一秒读取写入的信息
|
能够在命令后面跟一个数字做为参数(sleeptime)来设定获取信息的时间间隔
命令行打印信息参数含义:
ns |
数据库的名称和集合 |
Total |
在这个集合中操做花费的时间总和 |
Read |
读入操做花费的时间 |
Write |
写入操做花费的时间 |
输入命令中各个参数的含义:
-d :数据库名称 -c:集合名称 --csv是数据格式csv
-f :指名导出那些类 -o:导出文件的名称
l 数据导入:mongoimport
导入JSON数据
|
导入csv格式数据
|
其中,--type 指定的是导入数据的格式,-headerline指的是忽略导入数据的第一行(由于是类),-file指的是导入文件的路径。
l 数据导出:mongoexport工具
|
咱们能够查看导出的文件,能够发现是JSON格式的。同理咱们能够导出csv格式的数据。
|
l 数据备份:mongodump
|
这个命令会建立一个dump文件夹,备份的文件都放在这个文件夹里,也能够指定-o参数,将备份文件放入指定文件夹
l 数据恢复:mongorestore
数据恢复分为两种状况:原数据已删除和原数据未删除
实际操做中直接执行mongorestore命令便可恢复dump中的数据库
|
|