MongoDB
MongoDB 是一個高性能,開源,無模式的文檔型數據庫,開發語言是C++。它在許多場景下可用於替代傳統的關係型數據庫或鍵/值存儲方式。
1.特點
1.1 數據格式
在 MongoDB 中,文檔是對數據的抽象,它的表現形式就是我們常說的 BSON(Binary JSON )。
BSON 是一個輕量級的二進制數據格式。MongoDB 能夠使用 BSON,並將 BSON 作爲數據的存儲存放在磁盤中。
BSON 是爲效率而設計的,它只需要使用很少的空間,同時其編碼和解碼都是非常快速的。即使在最壞的情況下,BSON格式也比JSON格式再最好的情況下存儲效率高。
對於前端開發者來說,一個“文檔”就相當於一個對象:
{“name":"mengxiangyue","sex":"nan"}
對於文檔是有一些限制的:有序、區分大小寫的,所以下面的兩個文檔是與上面不同的:
{”sex“:"nan","name":"mengxiangyue"}
{"Name":"mengxiangyue","sex":"nan"}
另外,對於文檔的字段 MongoDB 有如下的限制:
_id必須存在,如果你插入的文檔中沒有該字段,那麼 MongoDB 會爲該文檔創建一個ObjectId作爲其值。_id的值必須在本集合中是唯一的。
多個文檔則組合爲一個“集合”。在 MongoDB 中的集合是無模式的,也就是說集合中存儲的文檔的結構可以是不同的,比如下面的兩個文檔可以同時存入到一個集合中:
{"name":"mengxiangyue"}
{"Name":"mengxiangyue","sex":"nan"}
1.2 性能
MongoDB 目前支持的存儲引擎爲內存映射引擎。當 MongoDB 啓動的時候,會將所有的數據文件映射到內存中,然後操作系統會託管所有的磁盤操作。這種存儲引擎有以下幾種特點:
* MongoDB 中關於內存管理的代碼非常精簡,畢竟相關的工作已經有操作系統進行託管。
* MongoDB 服務器使用的虛擬內存將非常巨大,並將超過整個數據文件的大小。不用擔心,操作系統會去處理這一切。
在《Mongodb億級數據量的性能測試》一文中,MongoDB 展現了強勁的大數據處理性能(數據甚至比Redis的漂亮的多)。
另外,MongoDB 提供了全索引支持:包括文檔內嵌對象及數組。Mongo的查詢優化器會分析查詢表達式,並生成一個高效的查詢計劃。通常能夠極大的提高查詢的效率。
1.3 持久化
MongoDB 在1.8版本之後開始支持 journal,就是我們常說的 redo log,用於故障恢復和持久化。
當系統啓動時,MongoDB 會將數據文件映射到一塊內存區域,稱之爲Shared view,在不開啓 journal 的系統中,數據直接寫入shared view,然後返回,系統每60s刷新這塊內存到磁盤,這樣,如果斷電或down機,就會丟失很多內存中未持久化的數據。
當系統開啓了 journal 功能,系統會再映射一塊內存區域供 journal 使用,稱之爲 private view,MongoDB 默認每100ms刷新 privateView 到 journal,也就是說,斷電或宕機,有可能丟失這100ms數據,一般都是可以忍受的,如果不能忍受,那就用程序寫log吧(但開啓journal後使用的虛擬內存是之前的兩倍)。
1.4 CAP類別
MongoDB 比較靈活,可以設置成 strong consistent (CP類型)或者 eventual consistent(AP類型)。
但其默認是 CP 類型(瞭解更多)。
2. Node下的使用
MongoDB 在 node 環境下的驅動引擎是 node-mongodb-native ,作爲依賴封裝到 mongodb 包裏,我們直接安裝即可:
npm install mongodb
實例:
var mongodb = require('mongodb'); var mongodbServer = new mongodb.Server('localhost', 27017, { auto_reconnect: true, poolSize: 10 }); var db = new mongodb.Db('mydb', mongodbServer); /* open db */ db.open(function() { /* Select 'contact' collection */ db.collection('contact', function(err, collection) { /* Insert a data */ collection.insert({ name: 'Fred Chien', email: '[email protected]', tel: [ '0926xxx5xx', '0912xx11xx' ] }, function(err, data) { if (data) { console.log('Successfully Insert'); } else { console.log('Failed to Insert'); } }); /* Querying */ collection.find({ name: 'Fred Chien' }, function(err, data) { /* Found this People */ if (data) { console.log('Name: ' + data.name + ', email: ' + data.email); } else { console.log('Cannot found'); } }); }); });
另外我們也可以使用MongoDB的ODM(面向對象數據庫管理器) —— mongoose 來做數據庫管理,具體參照其API文檔。
3. 優缺點
優勢
1. 強大的自動化 shading 功能(更多戳這裏);
2. 全索引支持,查詢非常高效;
3. 面向文檔(BSON)存儲,數據模式簡單而強大。
4. 支持動態查詢,查詢指令也使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
5. 支持 javascript 表達式查詢,可在服務器端執行任意的 javascript函數。
缺點
1. 單個文檔大小限制爲16M,32位系統上,不支持大於2.5G的數據;
2. 對內存要求比較大,至少要保證熱數據(索引,數據及系統其它開銷)都能裝進內存;
3. 非事務機制,無法保證事件的原子性。