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中的數據庫
|
|