MonogoDB入門教程01

注:本系列教程是自己學(xué)習(xí)的記錄忌堂,內(nèi)容來(lái)至 菜鳥(niǎo)教程
MongoDB入門教程01
MongoDB入門教程02
MongoDB入門教程03
MongoDB入門教程04
MongoDB入門教程05

1. MongoDB是什么倍阐?

一個(gè)NoSQL數(shù)據(jù)庫(kù)悬钳,是NoSQL中的一個(gè)分支:文檔數(shù)據(jù)庫(kù)缠捌。

一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)英染。由C++語(yǔ)言編寫搪锣,旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)方案。

一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品盔沫,是非關(guān)系數(shù)據(jù)庫(kù)中功能最豐富锌雀,最像關(guān)系數(shù)據(jù)庫(kù)的蚂夕。

在高負(fù)載的情況下迅诬,添加更多的節(jié)點(diǎn)腋逆,可以保證服務(wù)器性能。

2. MongoDB的主要特點(diǎn)

  • MongoDB是一個(gè)面向文檔存儲(chǔ)的數(shù)據(jù)庫(kù)侈贷,安裝惩歉、操作簡(jiǎn)單

  • 可以設(shè)置任何屬性的索引(如:firstname="Sameer", Address="8 Gandhi Road")來(lái)實(shí)現(xiàn)更快的排序

  • 可以通過(guò)本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,這使得MongoDB有更強(qiáng)的擴(kuò)展性

  • 如果負(fù)載增加(需要更多的存儲(chǔ)空間和更強(qiáng)的處理能力)俏蛮,可以分布在計(jì)算機(jī)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)上撑蚌,這就是所謂的分片

  • 支持豐富的查詢表達(dá)式。查詢指令使用JSON形式的標(biāo)記搏屑,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組

  • 使用update()命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段

  • Map/Reduce主要是用來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作

  • Map和Reduce Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄争涌,將key與value傳給Reduce函數(shù)進(jìn)行處理

  • Map函數(shù)和Reduce函數(shù)是使用Javascript編寫的,并可以通過(guò)db.runCommand或mapreduce命令來(lái)執(zhí)行MapReduce操作

  • GridFS是MongoDB中的一個(gè)內(nèi)置功能辣恋,可以用于存放大量小文件

  • 允許在服務(wù)端執(zhí)行腳本亮垫,可以用Javascript編寫某個(gè)函數(shù),直接在服務(wù)端執(zhí)行伟骨,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端饮潦,下次直接調(diào)用即可

  • 支持各種編程語(yǔ)言:RUBY,PYTHON携狭,JAVA继蜡,C++,PHP逛腿,C#等多種語(yǔ)言

3. NoSQL的應(yīng)用場(chǎng)景是什么稀并?

摘至:作者 接灰的電子產(chǎn)品 鏈接 http://www.reibang.com/p/fe3b9532b852

假設(shè)說(shuō)我們現(xiàn)在要構(gòu)建一個(gè)論壇,用戶可以發(fā)布帖子(帖子內(nèi)容包括文本单默、視頻碘举、音頻和圖片等)。那么我們可以畫(huà)出一個(gè)下圖的表關(guān)系結(jié)構(gòu)雕凹。


論壇表結(jié)構(gòu)

這種情況下如果我們需要展示帖子的文字殴俱,以及關(guān)聯(lián)的圖片、音頻枚抵、視頻线欲、用戶評(píng)論、贊和用戶信息的話汽摹,我們需要關(guān)聯(lián)8張表來(lái)取得自己想要的數(shù)據(jù)李丰。如果我們有這樣的帖子列表,隨著用戶的滾動(dòng)動(dòng)態(tài)加載逼泣,同時(shí)需要監(jiān)聽(tīng)是否有新內(nèi)容產(chǎn)生趴泌,這樣的一個(gè)任務(wù)我們需要太多這種復(fù)雜的查詢了舟舒。

NoSQL解決這類問(wèn)題的思路是,干脆拋棄傳統(tǒng)的表結(jié)構(gòu)嗜憔,直接存儲(chǔ)包含一個(gè)帖子所有內(nèi)容的數(shù)據(jù)秃励,像下面這樣。

{
 "id":"5894a12f-dae1-5ab0-5761-1371ba4f703e",
 "title":"2017年的Spring發(fā)展方向",
 "date":"2017-01-21",
 "body":"這篇文章主要探討如何利用Spring Boot集成NoSQL",
 "createdBy":User,
 "images":["http://dev.local/myfirstimage.png","http://dev.local/mysecondimage.png"],
 "videos":[
 {"url":"http://dev.local/myfirstvideo.mp4", "title":"The first video"},
 {"url":"http://dev.local/mysecondvideo.mp4", "title":"The second video"} 
 ],
 "audios":[ 
 {"url":"http://dev.local/myfirstaudio.mp3", "title":"The first audio"}, 
 {"url":"http://dev.local/mysecondaudio.mp3", "title":"The second audio"} 
 ]
}

NoSQL一般情況下是沒(méi)有Schema這個(gè)概念的吉捶,這給開(kāi)發(fā)帶來(lái)了較大的自由度夺鲜。因?yàn)樵陉P(guān)系型數(shù)據(jù)庫(kù)中,一旦Schema確定呐舔,以后更改Schema币励,維護(hù)Schema是很麻煩的一件事。但反過(guò)來(lái)說(shuō)Schema對(duì)于維護(hù)數(shù)據(jù)的完整性是非常必要的珊拼。

一般來(lái)說(shuō)食呻,如果你在做一個(gè)Web、物聯(lián)網(wǎng)等類型的項(xiàng)目澎现,你應(yīng)該考慮使用NoSQL仅胞。如果你要面對(duì)的是一個(gè)對(duì)數(shù)據(jù)的完整性、事務(wù)處理等有嚴(yán)格要求的環(huán)境(如財(cái)務(wù)系統(tǒng))昔头,則應(yīng)該考慮關(guān)系型數(shù)據(jù)庫(kù)饼问。

4. NoSQL 簡(jiǎn)介

NoSQL(= Not Only SQL),即"不僅僅是SQL"揭斧。

在現(xiàn)代的計(jì)算系統(tǒng)上每天網(wǎng)絡(luò)上都會(huì)產(chǎn)生龐大的數(shù)據(jù)量莱革。

這些數(shù)據(jù)有很大一部分是由關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)來(lái)處理。 1970年 E.F.Codd's提出的關(guān)系模型的論文 "A relational model of data for large shared data banks"讹开,這使得數(shù)據(jù)建模和應(yīng)用程序編程更加簡(jiǎn)單盅视。

關(guān)系型模型是非常適合于客戶服務(wù)器編程,是結(jié)構(gòu)化數(shù)據(jù)在網(wǎng)絡(luò)和商務(wù)應(yīng)用的主導(dǎo)技術(shù)旦万。

NoSQL用于超大規(guī)模數(shù)據(jù)的存儲(chǔ)闹击。這些類型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無(wú)需多余操作就可以橫向擴(kuò)展成艘。

select fun, profit from real_world where relational=false

5. 關(guān)系型數(shù)據(jù)庫(kù)遵循ACID規(guī)則

事務(wù) Transaction赏半,和現(xiàn)實(shí)中的交易很類似,有四個(gè)特性:

  1. A (Atomicity) 原子性

    事務(wù)里的所有操作淆两,要么全部做完断箫,要么都不做,只要事務(wù)中的一個(gè)任務(wù)失敗秋冰,整個(gè)事務(wù)就失敗仲义,需要回滾。如銀行轉(zhuǎn)賬,從A賬戶轉(zhuǎn)100元到B賬戶埃撵,分為兩個(gè)步驟:1)從A賬戶取100元赵颅;2)存入100元到B賬戶。要么一起做完暂刘,要么都不做饺谬,否則錢就會(huì)莫名其妙的少了100元。

  2. C (Consistency) 一致性

    數(shù)據(jù)庫(kù)要一直處于一致的狀態(tài)鸳惯,事務(wù)的運(yùn)行不會(huì)改變數(shù)據(jù)庫(kù)原本的一致性約束商蕴。如完整性約束 a + b = 10,如果一個(gè)事務(wù)改變了a芝发,那么必須改變b,使得事務(wù)結(jié)束后依然滿足 a+b=10苛谷,否則事務(wù)失敗辅鲸。

  3. I (Isolation) 獨(dú)立性

    獨(dú)立性指并發(fā)的事務(wù)之間不會(huì)互相影響,如果一個(gè)事務(wù)要訪問(wèn)的數(shù)據(jù)腹殿,正在被另一個(gè)事務(wù)修改独悴,只要另外一個(gè)事務(wù)未提交,它所訪問(wèn)的數(shù)據(jù)就不受未提交事務(wù)的影響锣尉。如從A賬戶轉(zhuǎn)100元到B賬戶刻炒,在這個(gè)交易尚未完成的情況下,B查詢自己的賬戶自沧,是看不到新增加的100元的坟奥。

  4. D (Durability) 持久性

    持久性是指一旦事務(wù)提交后,它的修改將會(huì)永久的保存在數(shù)據(jù)庫(kù)上拇厢,即使出現(xiàn)宕機(jī)也不會(huì)丟失爱谁。

6. 分布式系統(tǒng)

分布式系統(tǒng)(distributed system)由多臺(tái)計(jì)算機(jī)和通信的軟件組件通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)連接(本地網(wǎng)絡(luò)或廣域網(wǎng))組成。

分布式系統(tǒng)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)孝偎。正是因?yàn)檐浖奶匦苑玫校苑植际较到y(tǒng)具有高度的內(nèi)聚性和透明性。

因此,網(wǎng)絡(luò)和分布式系統(tǒng)之間的區(qū)別更多的在于高層軟件(特別是操作系統(tǒng)),而不是硬件森篷。

分布式系統(tǒng)可以應(yīng)用在不同的平臺(tái)上如:Pc窗宇、工作站、局域網(wǎng)和廣域網(wǎng)上等下面。

7. CAP定理(CAP theorem)

又稱布魯爾定理(Brewer's theorem):一個(gè)分布式計(jì)算系統(tǒng),不可能同時(shí)滿足以下三點(diǎn):

  • 一致性(Consistency)

    所有節(jié)點(diǎn)在同一時(shí)間具有相同的數(shù)據(jù)

  • 可用性(Availability)

    保證每個(gè)請(qǐng)求不管成功或者失敗都有響應(yīng)

  • 分隔容忍(Partition tolerance)

    系統(tǒng)中任意信息的丟失或失敗不會(huì)影響系統(tǒng)的繼續(xù)運(yùn)作

CAP的核心理論是:一個(gè)分布式系統(tǒng)不可能很好的同時(shí)滿足一致性,可用性和分隔容忍這三個(gè)需求叮姑,最多能同時(shí)滿足其中兩個(gè)。

因此,可將NoSQL數(shù)據(jù)庫(kù)分成滿足CA原則传透,滿足CP原則和滿足AP原則三大類:

  • CA:?jiǎn)吸c(diǎn)集群耘沼,滿足一致性和可用性,通常在可擴(kuò)展性上不強(qiáng)大

  • CP:滿足一致性朱盐,分區(qū)容忍性的系統(tǒng)群嗤,通常性能不是特別高

  • AP:滿足可用性,分區(qū)容忍性的系統(tǒng)兵琳,對(duì)一致性要求較低

image

8. 分布式計(jì)算的優(yōu)點(diǎn)

  • 可靠性(容錯(cuò))

    分布式計(jì)算系統(tǒng)中的一個(gè)重要優(yōu)點(diǎn)就是可靠性狂秘。一臺(tái)服務(wù)器的系統(tǒng)崩潰并不影響到其余的服務(wù)器

  • 可擴(kuò)展性

    在分布式計(jì)算系統(tǒng)可以根據(jù)需要增加更多的機(jī)器

  • 資源共享

    共享數(shù)據(jù)是必不可少的應(yīng)用,如銀行躯肌、預(yù)定系統(tǒng)

  • 靈活性

    由于該系統(tǒng)非常靈活者春,它更容易安裝,實(shí)施和調(diào)試新的服務(wù)

  • 更快的速度

    分布式計(jì)算系統(tǒng)可以有多臺(tái)計(jì)算機(jī)的計(jì)算能力清女,使得它比其他系統(tǒng)有更快的處理速度

  • 開(kāi)放系統(tǒng)

    本地或者遠(yuǎn)程都能訪問(wèn)到該服務(wù)

  • 更高的性能

    更好的性價(jià)比

9. 分布式計(jì)算的缺點(diǎn)

  • 故障排除

    故障排除和診斷問(wèn)題更加困難

  • 軟件

    更少的軟件支持

  • 網(wǎng)絡(luò)

    基礎(chǔ)設(shè)施的問(wèn)題钱烟,包括:傳輸問(wèn)題,高負(fù)載嫡丙,信息丟失等

  • 安全性

    開(kāi)放系統(tǒng)的特性存在數(shù)據(jù)的安全性和共享的風(fēng)險(xiǎn)等問(wèn)題

10. RDBMS vs NoSQL

RDBMS
  • 高度組織化結(jié)構(gòu)化數(shù)據(jù)

  • 結(jié)構(gòu)化查詢語(yǔ)言 SQL

  • 數(shù)據(jù)和關(guān)系都存儲(chǔ)在單獨(dú)的表中

  • 數(shù)據(jù)操作語(yǔ)言拴袭,數(shù)據(jù)定義語(yǔ)言

  • 嚴(yán)格的一致性

  • 基礎(chǔ)事務(wù)

NoSQL
  • 代表著不僅僅是SQL

  • 沒(méi)有聲明性查詢語(yǔ)言

  • 沒(méi)有預(yù)定義的模式

  • key-value 鍵值對(duì)存儲(chǔ),列存儲(chǔ)曙博,文檔存儲(chǔ)拥刻,圖形數(shù)據(jù)庫(kù)

  • 最終一致性,而非ACID屬性

  • 非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)

  • CAP定理

  • 高性能父泳,高可用性和可伸縮性

11. BASE

Base:Basically Available般哼,Soft-state,Eventually Consistent

BASE是NoSQL數(shù)據(jù)庫(kù)通常對(duì)可用性及一致性的弱要求原則:

  • Basically Available — 基本可用

  • Soft-state — 軟狀態(tài)/柔性事務(wù)尘吗。無(wú)連接的

  • Eventually Consistent — 最終一致性逝她,ACID的最終目的

12. NoSQL數(shù)據(jù)庫(kù)的分類

類型 代表NoSQL 特點(diǎn)
列存儲(chǔ) Hbase、 Cassandra睬捶、 Hypertable 按列存儲(chǔ)數(shù)據(jù)黔宛。特點(diǎn)是方便存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便數(shù)據(jù)壓縮擒贸,對(duì)針對(duì)某一列或者某幾列的查詢有非常大的IO優(yōu)勢(shì)
文檔存儲(chǔ) MongoDB臀晃、CouchDB 文檔存儲(chǔ) 一般用類似json的格式存儲(chǔ),存儲(chǔ)的內(nèi)容是文檔型的介劫。這樣也就有有機(jī)會(huì)對(duì)某些字段建立索引徽惋,實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫(kù)的某些功能。
鍵值對(duì)存儲(chǔ) Redis座韵、 Tokyo Cabinet / Tyrant险绘、 Berkeley DB踢京、 MemcacheDB 可以通過(guò)key快速查詢到其value。一般來(lái)說(shuō)宦棺,存儲(chǔ)不管value的格式瓣距,照單全收。(Redis包含了其他功能)
圖存儲(chǔ) Neo4J代咸、FlockDB 圖形關(guān)系的最佳存儲(chǔ)蹈丸。使用傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)來(lái)解決的話性能低下,而且設(shè)計(jì)使用不方便呐芥。
對(duì)象存儲(chǔ) db4o逻杖、 Versant 通過(guò)類似面向?qū)ο笳Z(yǔ)言的語(yǔ)法操作數(shù)據(jù)庫(kù),通過(guò)對(duì)象的方式存取數(shù)據(jù)思瘟。
xml數(shù)據(jù)庫(kù) Berkeley DB XML荸百、 BaseX 高效的存儲(chǔ)XML數(shù)據(jù),并支持XML的內(nèi)部查詢語(yǔ)法潮太,比如XQuery,Xpath管搪。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铡买,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霎箍,老刑警劉巖奇钞,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異漂坏,居然都是意外死亡景埃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門顶别,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谷徙,“玉大人,你說(shuō)我怎么就攤上這事驯绎⊥昊郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵剩失,是天一觀的道長(zhǎng)屈尼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拴孤,這世上最難降的妖魔是什么脾歧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮演熟,結(jié)果婚禮上鞭执,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好兄纺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布大溜。 她就那樣靜靜地躺著,像睡著了一般囤热。 火紅的嫁衣襯著肌膚如雪猎提。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天旁蔼,我揣著相機(jī)與錄音锨苏,去河邊找鬼。 笑死棺聊,一個(gè)胖子當(dāng)著我的面吹牛伞租,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播限佩,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼葵诈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了祟同?” 一聲冷哼從身側(cè)響起作喘,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晕城,沒(méi)想到半個(gè)月后泞坦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砖顷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贰锁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滤蝠。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豌熄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出物咳,到底是詐尸還是另有隱情锣险,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布所森,位于F島的核電站囱持,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏焕济。R本人自食惡果不足惜纷妆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晴弃。 院中可真熱鬧掩幢,春花似錦逊拍、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至世曾,卻和暖如春缨恒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轮听。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工骗露, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人血巍。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓萧锉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親述寡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柿隙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容