NOSQL-MongoDB簡介

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. 非事務機制,無法保證事件的原子性。

發佈了138 篇原創文章 · 獲贊 38 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章