開發(fā)者如何學(xué)好 MongoDB
作為一名研發(fā),數(shù)據(jù)庫是或多或少都會接觸到的技術(shù)。 MongoDB 是當前火熱的 NoSQL 之一,我們怎樣才能學(xué)好 MongoDB 呢?本篇文章,我們將從以下幾方面討論這個話題:
MongoDB 是什么
我如何確定我需要學(xué)習(xí) MongoDB
開發(fā)者應(yīng)該掌握 MongoDB 的哪些知識
學(xué)習(xí)的選擇和困境
我們先來了解一下,MongoDB 為何物。
NoSQL 泛指非關(guān)系型數(shù)據(jù)庫,該詞是關(guān)系型數(shù)據(jù)庫(即 SQL)的相對稱呼。MongoDB 是非關(guān)系型數(shù)據(jù)庫(NoSQL)中較為人熟知的一種。
它擁有很多優(yōu)秀特性,例如高性能、高可用、支持豐富的查詢語句、無需預(yù)定義數(shù)據(jù)模型和水平可伸縮等,適合存儲結(jié)構(gòu)化、半結(jié)構(gòu)化的文檔和特定格式的文檔,這些特性使它受到眾多開發(fā)者的青睞。
我們通過幾個例子來看看 MySQL 與 MongoDB 的差異。
與 MySQL 數(shù)據(jù)庫不同的是,MongoDB 不需要預(yù)先定義表和字段,這正是它靈活性的體現(xiàn)。MongoDB 可以擁有多個數(shù)據(jù)庫,每個數(shù)據(jù)庫可以擁有多個集合,每個集合可以存儲多份文檔,這種關(guān)系與 SQL 數(shù)據(jù)庫中的“數(shù)據(jù)庫、表、數(shù)據(jù)”相當。下圖描述了 MongoDB 中數(shù)據(jù)庫、集合和文檔的關(guān)系:
數(shù)據(jù)庫 fotoo 中有兩個集合,它們分別是 player 和 books。每個集合中都包含了許多文檔,例如集合 books 中關(guān)于書籍《紅樓夢》的文檔,集合 player 中關(guān)于球員 James 的文檔。
在查詢方面,一個簡單的 MySQL 查詢語句為 SELECT * FROM tablename,對應(yīng)的 MongoDB 查詢語句為 db.tablename.find()。在面對多步驟的查詢條件時,MongoDB 更游刃有余。例如:
“統(tǒng)計數(shù)據(jù)庫 artic 中 score 大于 70 且小于 90 的文檔數(shù)量”
這樣的需求,用 MongoDB 的聚合操作就可以輕松完成,對應(yīng)示例如下:
>?db.artic.aggregate([?...?{$match:?{score:?{$gt:?70,?$lt:?90}}},?...?{$group:?{_id:?null,?number:?{$sum:?1}}}?...?])?復(fù)制代碼
這個例子或許簡單了些,在 MySQL 中我們可以用 count 和 where 完成,但如果復(fù)雜度再提高四五個等級呢?例如在此基礎(chǔ)上增加對某個字段的運算、替換、排序、分組計數(shù)、增刪字段,用 MySQL 來實現(xiàn)就會很頭疼,而 MongoDB 的聚合可以讓我們輕松地完成這類復(fù)雜需求。
我如何確定我需要學(xué)習(xí) MongoDB
MongoDB 是近些年涌現(xiàn)的幾十種 NoSQL 中第一梯隊的成員,另外一個為人熟知的是 Redis。
你可能會有”我如何確定我需要學(xué)習(xí) MongoDB 呢?“ 這樣的疑問,面對這個問題,我們可以通過 MongoDB 的特點和應(yīng)用場景著手:
MongoDB 適合存儲結(jié)構(gòu)確定或不確定的文檔。例如爬蟲爬取的信息常缺失字段的情況或字段參差不齊的情況;
對數(shù)據(jù)庫可用性要求較高的情況。MySQL 這類數(shù)據(jù)庫要做到負載均衡、自動容災(zāi)和數(shù)據(jù)同步需要借助外部工具,而 MongoDB 的復(fù)制集可以讓我們輕松完成這一系列的工作。相對接借助第三方工具來說,復(fù)制集的穩(wěn)定性更高。
分庫分表是 WEB 開發(fā)中常用到的數(shù)據(jù)庫優(yōu)化手段,MySQL 的分庫分表要考慮的問題非常多,例如字段冗余、數(shù)據(jù)組裝跨節(jié)點分頁、排序和數(shù)據(jù)遷移等,而 MongoDB 的分片可以讓我們輕松完成“分庫分表”的工作。MongoDB 的分片機制使我們不必將心思放在由“分庫分表”帶來的問題,而是專注于具體需求。
同樣的,MySQL 的權(quán)限控制、定義數(shù)據(jù)模型、數(shù)據(jù)庫備份和恢復(fù)等功能在 MongoDB 上也有。
MongoDB 中支持地理位置的存儲和查詢,這意味著 MongoDB 可以用于共享單車、共享雨傘、汽車定位等業(yè)務(wù)中。
我們常用的關(guān)系型數(shù)據(jù)庫無法滿足 WEB2.0 時代的需求,在實際應(yīng)用中暴露了很多難以克服的問題。NoSQL 的產(chǎn)生就是為了解決例如海量數(shù)據(jù)的存儲、彈性可伸縮和靈活性等方面的挑戰(zhàn),所以作為一名合格的開發(fā)者,應(yīng)該抽空學(xué)習(xí) SQL 以外的數(shù)據(jù)庫知識。
開發(fā)者應(yīng)該掌握 MongoDB 的哪些知識
學(xué)習(xí)前,我們需要明白自身定位:專業(yè) DBA 或者日常開發(fā)使用。
MongoDB 有完善的體系和對應(yīng)的認證考試,對于希望成為專業(yè) DBA 的朋友我建議到 MongoDB 官方網(wǎng)站了解。
而對于僅需要滿足日常開發(fā)需求的朋友,我建議學(xué)習(xí)的內(nèi)容如下:
MongoDB 在各個平臺的安裝方法
MongoDB 數(shù)據(jù)庫和集合的基本操作
MongoDB 文檔 CRUD 操作,包括能夠豐富 CRUD 的投影和修飾符等
MongoDB 流式聚合操作,這能夠在數(shù)據(jù)庫層面輕松完成復(fù)雜數(shù)據(jù)的處理,而不是用編程語言來處理
MongoDB 的數(shù)據(jù)模型,雖然 MongoDB 可以存儲不規(guī)則的文檔,但有些情況下定義數(shù)據(jù)模型可以提高查詢效率
下圖描述了一種聚合操作的完整過程:
當然,除了這些基本操作之外我們還可以學(xué)習(xí)更多的知識提高個人競爭力,這些知識是:
MongoDB 執(zhí)行計劃和索引,執(zhí)行計劃可以讓我們清楚的了解到查詢語句的效率,而索引則是優(yōu)化查詢效率的常用手段
MongoDB 的復(fù)制集,這是提高 MongoDB 可用性,保證數(shù)據(jù)服務(wù)不停機的最佳手段
MongoDB 的分片,分片能夠在數(shù)據(jù)量變得龐大之后保證效率
MongoDB 的事物,如果你將 MongoDB 用于 WEB 網(wǎng)站,那么事物是你必須學(xué)習(xí)的知識
MongoDB 數(shù)據(jù)庫備份和還原,有了復(fù)制集后,備份就顯得不是那么重要了,但并不是沒有這個需求。而且 MongoDB 的備份可以精細到文檔,這就非常有意義了。
學(xué)習(xí)的選擇和困境
有一定工作經(jīng)驗的開發(fā)者,大多數(shù)情況下都會選擇自學(xué)。有些在網(wǎng)上搜索對應(yīng)的文章,有些則直接翻閱官方文檔。
我推薦的方式是翻閱官方文檔,在遇到難以理解的觀點時通過搜索引擎查找網(wǎng)友分享的文章。
自學(xué)的優(yōu)點很多,缺點也很明顯。例如:
斷斷續(xù)續(xù)的學(xué)習(xí),難以保持專注導(dǎo)致知識吸收不好
耗費時間很長,雖然知道應(yīng)該學(xué)習(xí)哪些方面的知識,但文檔并不是按你所想而規(guī)劃的,所以翻閱文檔要費很多功夫
知識不成體系,東看看西看看,沒有歸納容易忘記
學(xué)習(xí)就需要記筆記,這又是一件很費時間的事情
官方文檔有些觀點難以理解,卡在半路很難受
零星學(xué)了一兩個月,也不確定學(xué)會了沒有,內(nèi)心毫無把握
如果不自學(xué),就得找一些成體系的教程來幫助自己快速進步,少走彎路。知識付費時代,在條件允許的情況下適當?shù)赝度胍彩呛芎玫倪x擇。
但面對動輒幾百的費用,不少開發(fā)者還是感覺略有壓力,畢竟我們搬磚的經(jīng)濟壓力也非常大。 考慮到這些問題,這里推薦韋世東的文章 《超高性價比的 MongoDB 零基礎(chǔ)快速入門實戰(zhàn)教程》,它售價不到 10 塊錢。
這篇文章的內(nèi)容幾乎囊括了上面我們提到的所有知識點,看完這篇僅 5 萬詞的文章,你將收獲:
文檔的 CRUD 操作和 Cursor 對象
掌握流式聚合操作,輕松面對任何數(shù)據(jù)處理需求
了解 MongoDB 的查詢效率和優(yōu)化
如何提高 MongoDB 的可用性
如何應(yīng)對數(shù)據(jù)服務(wù)故障
理解 MongoDB 的訪問控制
學(xué)會用數(shù)據(jù)模型降低數(shù)據(jù)冗余,提高效率
掌握 mongodump 數(shù)據(jù)備份與還原方法
這樣就可以勝任日常開發(fā)中對數(shù)據(jù)庫操作能力的要求了。這篇文章適合對 MongoDB 感興趣的零基礎(chǔ)開發(fā)者或者有一定基礎(chǔ),想要繼續(xù)鞏固和加深學(xué)習(xí)的開發(fā)者。
文章篇幅很長,內(nèi)容詳盡,不乏優(yōu)質(zhì)配圖,例如描述復(fù)制集節(jié)點關(guān)系的圖:
描述節(jié)主點掉線,重新選舉主節(jié)點的圖
如果你覺得有學(xué)習(xí) MongoDB 的需要,且這篇文章規(guī)劃的內(nèi)容是你想要的內(nèi)容,那么請前往訂閱吧!
https://juejin.im/post/5d53967af265da03d0639837
MongoDB 開發(fā)者
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。