1、mongodb簡介
MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json 的bjson 格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。MongoDB 最大的特點(diǎn)是他支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。它是一個(gè)面向集合的,模式自由的文檔型數(shù)據(jù)庫。
1.1、面向集合(Collenction-Orented)
意思是數(shù)據(jù)被分組存儲(chǔ)在數(shù)據(jù)集中, 被稱為一個(gè)集合(Collenction)。每個(gè)集合在數(shù)據(jù)庫中都有一個(gè)唯一的標(biāo)識(shí)名,并且可以包含無限數(shù)目的文檔。集合的概念類似關(guān)系型數(shù)據(jù)庫(RDBMS)里的表(table),不同的是它不需要定義任何模式(schema)。
1.2、 模式自由(schema-free)
對(duì)于存儲(chǔ)在MongoDB 數(shù)據(jù)庫中的文件,我們不需要知道它的任何結(jié)構(gòu)定義。無需如關(guān)系型數(shù)據(jù)庫一樣提前定義表結(jié)構(gòu),或如ElasticSearch一樣定義mapper映射。在Mongodb中,我們可以自由擴(kuò)展或刪除字段。
1.3、 文檔型
Mongodb以bson格式存儲(chǔ)數(shù)據(jù),其類似于JSON結(jié)構(gòu),但對(duì)JSON的數(shù)據(jù)類型進(jìn)行了擴(kuò)充。其存儲(chǔ)以bson文檔格式的數(shù)據(jù)。我們存儲(chǔ)的數(shù)據(jù)是鍵-值對(duì)的集合,鍵是字符串,值可以是數(shù)據(jù)類型集合里的任意類型,包括數(shù)組和文檔. 我們把這個(gè)數(shù)據(jù)格式稱作 “BSON” 即 “Binary Serialized Document Notation”。
2、Mongodb特點(diǎn)
- 易于使用與擴(kuò)展:不采用關(guān)系模型,面向集合存儲(chǔ),采用文檔模型,便于開發(fā)者快速迭代;
- 索引豐富,支持二級(jí)索引,允許多種快速索引,如唯一索引、復(fù)合索引、地理空間索引、全文檢索等;
- 支持聚合管道,用戶能通過簡單的片段創(chuàng)建復(fù)雜的聚合,并通過數(shù)據(jù)庫自動(dòng)優(yōu)化。
- 支持豐富的集合類型,如TTL類型集合,固定大小集合等;
- 支持文件存儲(chǔ),基于一種易用的協(xié)議,存儲(chǔ)大文件和文件元數(shù)據(jù)。
- 支持動(dòng)態(tài)查詢;
- 支持復(fù)制和故障恢復(fù);
- 使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),包括大型對(duì)象(如視頻等);
- 自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性;
- 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及C++語言的驅(qū)動(dòng)程序,社區(qū) 中也提供了對(duì)Erlang 及.NET 等平臺(tái)的驅(qū)動(dòng)程序;
- 文件存儲(chǔ)格式為BSON(一種JSON 的擴(kuò)展);
- 可通過網(wǎng)絡(luò)訪問;
3、Mongodb功能簡介
- 面向集合的存儲(chǔ):適合存儲(chǔ)對(duì)象及JSON 形式的數(shù)據(jù);
- 動(dòng)態(tài)查詢:MongoDB 支持豐富的查詢表達(dá)式。查詢指令使用JSON 形式的標(biāo)記,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組;
- 完整的索引支持:包括文檔內(nèi)嵌對(duì)象及數(shù)組。MongoDB 的查詢優(yōu)化器會(huì)分析查詢表達(dá)式,并生成一個(gè)高效的查詢計(jì)劃;
- 查詢監(jiān)視:MongoDB 包含一系列監(jiān)視工具用于分析數(shù)據(jù)庫操作的性能;
- 復(fù)制及自動(dòng)故障轉(zhuǎn)移:MongoDB 數(shù)據(jù)庫支持服務(wù)器之間的數(shù)據(jù)復(fù)制,支持主-從模式及服務(wù)器之間的相互復(fù)制。復(fù)制的主要目標(biāo)是提供冗余及自動(dòng)故障轉(zhuǎn)移;
- 高效的傳統(tǒng)存儲(chǔ)方式:支持二進(jìn)制數(shù)據(jù)及大型對(duì)象(如照片或圖片);
- 自動(dòng)分片以支持云級(jí)別的伸縮性:自動(dòng)分片功能支持水平的數(shù)據(jù)庫集群,可動(dòng)態(tài)添加額外的機(jī)器;
4、適用場(chǎng)景
- 網(wǎng)站數(shù)據(jù):MongoDB 非常適合實(shí)時(shí)的插入,更新與查詢,并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需的復(fù)制及高度伸縮性;
- 緩存:由于性能很高,MongoDB 也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后,由MongoDB 搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過載;
- 大尺寸,低價(jià)值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫存儲(chǔ)一些數(shù)據(jù)時(shí)可能會(huì)比較昂貴,在此之前,很多時(shí)候程序員往往會(huì)選擇傳統(tǒng)的文件進(jìn)行存儲(chǔ);
- 高伸縮性的場(chǎng)景:MongoDB 非常適合由數(shù)十或數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫。MongoDB的路線圖中已經(jīng)包含對(duì)MapReduce 引擎的內(nèi)置支持;
- 用于對(duì)象及JSON 數(shù)據(jù)的存儲(chǔ):MongoDB 的BSON 數(shù)據(jù)格式非常適合文檔化格式的存儲(chǔ)及查詢;
5、數(shù)據(jù)邏輯結(jié)構(gòu)
MongoDB 的邏輯結(jié)構(gòu)是一種層次結(jié)構(gòu)。主要由:文檔(document)、集合(collection)、數(shù)據(jù)庫(database)這三部分組成的。邏輯結(jié)構(gòu)是面向用戶的,用戶使用MongoDB 開發(fā)應(yīng)用程序使用的就是邏輯結(jié)構(gòu)。
- MongoDB 的文檔(document),相當(dāng)于關(guān)系數(shù)據(jù)庫中的一行記錄。
- 多個(gè)文檔組成一個(gè)集合(collection),相當(dāng)于關(guān)系數(shù)據(jù)庫的表。
- 多個(gè)集合(collection),邏輯上組織在一起,就是數(shù)據(jù)庫(database)。
- 一個(gè)MongoDB 實(shí)例支持多個(gè)數(shù)據(jù)庫(database)。
文檔(document)、集合(collection)、數(shù)據(jù)庫(database)的層次結(jié)構(gòu)如下圖:

mongodb與關(guān)系型數(shù)據(jù)庫的邏輯結(jié)構(gòu)對(duì)比:
| MongoDB術(shù)語/概念 | SQL術(shù)語/概念 | 解釋說明 |
|---|---|---|
| database | database | 數(shù)據(jù)庫 |
| collection | table | 數(shù)據(jù)庫表/集合 |
| document | row | 數(shù)據(jù)記錄行/文檔 |
| field | column | 數(shù)據(jù)字段/域 |
| index | index | 索引 |
| table joins | 表連接,MongoDB不支持 | |
| primary key | primary key | 主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵 |
6、數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
MongoDB 的默認(rèn)數(shù)據(jù)目錄是/data/db,它負(fù)責(zé)存儲(chǔ)所有的MongoDB 的數(shù)據(jù)文件。在MongoDB內(nèi)部,每個(gè)數(shù)據(jù)庫都包含一個(gè).ns 文件和一些數(shù)據(jù)文件,而且這些數(shù)據(jù)文件會(huì)隨著數(shù)據(jù)量的增加而變得越來越多。所以如果系統(tǒng)中有一個(gè)叫做foo 的數(shù)據(jù)庫,那么構(gòu)成foo 這個(gè)數(shù)據(jù)庫的文件就會(huì)由foo.ns,foo.0,foo.1,foo.2 等等組成。
MongoDB 內(nèi)部有預(yù)分配空間的機(jī)制,每個(gè)預(yù)分配的文件都用0 進(jìn)行填充,由于有了這個(gè)機(jī)制, MongoDB 始終保持額外的空間和空余的數(shù)據(jù)文件,從而有效避免了由于數(shù)據(jù)暴增而帶來的磁盤壓力過大的問題。
由于表中數(shù)據(jù)量的增加,數(shù)據(jù)文件每新分配一次,它的大小都會(huì)是上一個(gè)數(shù)據(jù)文件大小的2倍,每個(gè)數(shù)據(jù)文件最大2G。這樣的機(jī)制有利于防止較小的數(shù)據(jù)庫浪費(fèi)過多的磁盤空間,同時(shí)又能保證較大的數(shù)據(jù)庫有相應(yīng)的預(yù)留空間使用。
數(shù)據(jù)庫的每張表都對(duì)應(yīng)一個(gè)命名空間,每個(gè)索引也有對(duì)應(yīng)的命名空間。這些命名空間的元數(shù)據(jù)都集中在*.ns 文件中。
7、mongodb的數(shù)據(jù)類型
MongoDB文檔存儲(chǔ)是使用BSON類型,BSON(BSON short for Bin-ary JSON, is a bin-ary-en-coded seri-al-iz-a-tion of JSON-like doc-u-ments)是二進(jìn)制序列化的形式。類如JSON,同樣支持內(nèi)嵌各種類型。
MongoDB 常用數(shù)據(jù)類型:
| 數(shù)據(jù)類型 | 說明 | 示例 |
|---|---|---|
| String | 字符串。存儲(chǔ)數(shù)據(jù)常用的數(shù)據(jù)類型。在 MongoDB 中,UTF-8 編碼的字符串才是合法的。 | {"a" : "string"} |
| Number | 數(shù)值類型。不區(qū)分整數(shù)和浮點(diǎn)數(shù)。 | {"a" : 1.34}或{"a" : 123} |
| Integer | 整型數(shù)值。用于存儲(chǔ)數(shù)值。根據(jù)你所采用的服務(wù)器,可分為 32 位或 64 位。 | 整數(shù):{"a" : 123}或 {"a" : NumberInt("3")} 或{"a" : NumberLong("3")} |
| Boolean | 布爾值。用于存儲(chǔ)布爾值(真/假)。 | {"a" : true} |
| Double | 雙精度浮點(diǎn)值。用于存儲(chǔ)浮點(diǎn)值。 | {"a" : 1.34} |
| Min/Max keys | 將一個(gè)值與 BSON(二進(jìn)制的 JSON)元素的最低值和最高值相對(duì)比。 | |
| Array | 用于將數(shù)組或列表或多個(gè)值存儲(chǔ)為一個(gè)鍵。 | {"a" : ["b", "c" , "d", "e"]} |
| Timestamp | 時(shí)間戳。記錄文檔修改或添加的具體時(shí)間。 | |
| Object | 用于內(nèi)嵌文檔。 | {"a" : {"b" : "c" , "d" : "e"}} |
| Null | 用于創(chuàng)建空值。 | {"a" : null} |
| Symbol | 符號(hào)。該數(shù)據(jù)類型基本上等同于字符串類型,但不同的是,它一般用于采用特殊符號(hào)類型的語言。 | |
| Date | 日期時(shí)間。用 UNIX 時(shí)間格式來存儲(chǔ)當(dāng)前日期或時(shí)間。你可以指定自己的日期時(shí)間:創(chuàng)建 Date 對(duì)象,傳入年月日信息。 | {"a" : new Date()} |
| Object ID | 對(duì)象 ID。用于創(chuàng)建文檔的 ID。 (每個(gè)文檔都有) | {"a" : ObjectId()} |
| Binary Data | 二進(jìn)制數(shù)據(jù)。用于存儲(chǔ)二進(jìn)制數(shù)據(jù)。 | {"a" : function() { /* ... */ }} |
| Code | 代碼類型。用于在文檔中存儲(chǔ) JavaScript 代碼。 | |
| Regular expression | 正則表達(dá)式 | {“a”:/^egon.*?nb$/i} |