天天看點

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

文章作者公衆号

bigsai

,已收錄在 回車課堂 ,如有幫助還請不吝啬點個贊贊支援一下!

課程導學

大家好我是bigsai,我們都學過資料庫,但你可能更熟悉關系(型)資料庫例如MySQL,SQL SERVER,ORACLE等,對于非關系(型)資料庫可能比較陌生,因為大部分入門級項目或者學習對非關系型資料庫的使用要求并不高,是以你了解的會更少。但談起性能和功能,非關系資料庫的表現那可謂是非常亮眼了!咱們今天就介紹學習以及使用其中一種非關系型資料庫——MongoDB資料庫!

本篇會介紹MongoDB相關内容以及MongoDB的安裝,但是你電腦需要擁有Studio 3T(下載下傳位址

https://studio3t.com/

)用來連接配接管理MongoDB。

如果以前沒見過或者沒使用過也不要緊,本課程包教包會!

通過本次篇你可以掌握以下内容:

  • 認識MongoDB
  • 實作MongoDB的增删改查

第一關 MongoDB介紹

在介紹MongoDB之前,問個問題,你知道什麼是MongoDB嗎?

你可能會說它是個非關系型資料庫,更多的可能就不太了解了,不要緊,我們一層一層捋一下。

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

1.1 非關系型資料庫

NoSQL(Not Only SQL),直譯過來不僅僅是資料庫,泛指非關系型資料庫。随着網際網路web2.0網站的興起,傳統的關系型資料庫在處理web2.0網站,特别是超大規模和高并發類型的web2.0純動态網站已經顯得力不從心,出現了很多難以克服的問題,而非關系型資料庫則由于其本身的特點得到了非常迅速地發展。非關系型資料庫的産生就是為了解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用難題。

而非關系型資料庫又分為好幾種:

鍵值(Key-Value)存儲資料庫 :這類資料庫會使用一個哈希表,這種模型很像Java中的HashMap的使用,其使用比較簡單,容易部署,但如果隻對部分資料查詢或更新時效率不是很高,這類非關系資料庫有Redis、Oracle BDB 等。

列存儲資料庫 :這部分資料庫通常是用來應對分布式存儲的海量資料。鍵仍然存在,但是它們的特點是指向了多個列。這些列是由列家族來安排的。如: HBase, Riak 等。

文檔型資料庫 :它同鍵值存儲類似。該類型的資料以特定的格式存儲,比如JSON。文檔型資料庫可以看作是鍵值資料庫的更新版,允許之間嵌套鍵值,在處理網頁等複雜資料時比傳統鍵值資料庫的查詢效率更高 。而MongoDB 就是一種高效的文檔資料庫。

圖形資料庫 :圖形資料庫是一種非關系型資料庫,它應用圖形理論存儲實體之間的關系資訊,可以良好地拓展到其他伺服器上。

盡管非關系型資料庫(NoSQL)有這麼多的差別,但是它們還是有很多共性特點:

易拓展:NoSQL資料庫種類繁多,但都有一個共同的特點:去掉關系型資料庫的關系型特性。資料之間無關系,全靠設計者的設計。這樣就非常容易擴充,無形之間也在架構的層面上帶來了可擴充的能力。

大資料量,高性能:NoSQL資料庫都具有非常高的讀寫性能,尤其在大資料量下讀寫性能也很高。這得益于它的無關系性,資料庫結構簡單 ,能夠快速查找定位到資料。

1.2 MongoDB的特點

講完NoSQL是啥,咱們再來捋一捋MongoDB是個啥。MongoDB又是啥呢?

MongoDB是一個基于分布式檔案存儲的資料庫。由C++語言編寫。旨在為web應用提供可擴充的高性能資料存儲解決方案。MongoDB是一個介于關系型資料庫和非關系型資料庫之間的産品,是非關系型資料庫當中功能最豐富,最像關系型資料庫的。它支援的資料結構非常松散,是類似JSON的BSON格式,是以可以存儲比較複雜的資料類型。MongoDB最大的特點是它支援的查詢語言非常強大,其文法有點類似于面向對象的查詢語言,幾乎可以實作類似關系資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。

并且MongoDB最近越來越火。作為一款基于文檔的非關系型資料庫,在越來越多的場景可以使用。通過學習歸納MongoDB官方文檔(

https://docs.mongodb.com/manual/

),總結MongoDB有以下特點:

  • 容易使用: MongoDB 将資料存儲在靈活的,類似于JSON的文檔中, 文檔模型映射到應用程式代碼中的對象,進而使資料易于使用。
  • 高性能: MongoDB提供高性能的資料持久性。特别是,對嵌入式資料模型的支援減少了資料庫系統上的I / O活動。

    索引支援更快的查詢,并且可以包含來自嵌入式文檔和數組的鍵。

  • 豐富的查詢語言: MongoDB支援豐富的查詢語言以支援讀寫操作(CRUD)以及:資料彙總文本搜尋和地理空間查詢。
  • 高可用性: MongoDB的複制工具(稱為副本集)提供:自動故障轉移、資料備援。
  • 水準可伸縮性: MongoDB提供水準可伸縮性作為其核心功能的一部分:分片在一組計算機叢集分布資料。

    從3.4開始,MongoDB支援基于shard鍵建立資料區域。在平衡叢集中,MongoDB僅将區域覆寫的讀寫定向到區域内的那些分片。

  • 支援多種存儲引擎 MongoDB支援多個存儲引擎:

    WiredTiger存儲引擎(包括對靜态加密的支援 )

記憶體中存儲引擎。

總結的來說,一個NoSQL該有的高性能MongoDB一應俱全,并且是一個使用很友善、很擅長儲存的非關系型文檔資料庫。但MongoDB并非100%的完美,它也有一定的缺陷比如不支援事務、占用記憶體比較大、删除記錄不釋放空間、沒有成熟的維護工具等。

1.3 MongoDB的應用場景

有了以上的特性,在日益繁雜的web領域MongoDB有很多它擅長之處。

  • 網站實時資料的插入、更新、删除。
  • 規模較大但是成本很高的資料(大尺寸、低價值資料)
  • 對象或JSON的文本存儲
  • 不需要經常通過表計算的,對事務要求不高的資料。
  • 一些應用層的緩存

具體的應用場景有:

  • 社交場景,使用 MongoDB 存儲使用者資訊,以及使用者發表的朋友圈資訊,通過地理位置索引實作附近的人、地點等功能。
  • 遊戲場景,使用 MongoDB 存儲遊戲使用者資訊,使用者的裝備、積分等直接以内嵌文檔的形式存儲,友善查詢、高效率存儲和通路。
  • 物流場景,使用 MongoDB 存儲訂單資訊,訂單狀态在運送過程中會不斷更新,以 MongoDB 内嵌數組的形式來存儲,一次查詢就能将訂單所有的變更讀取出來。
  • 物聯網場景,使用 MongoDB 存儲所有接入的智能裝置資訊,以及裝置彙報的日志資訊,并對這些資訊進行多元度的分析。
  • 視訊直播,使用 MongoDB 存儲使用者資訊、點贊互動資訊等。

這些場景都有資料量大、寫入操作頻繁、資料價值較低、事務性要求不高的特點。

很多人把MongoDB當成窮人的大資料。你可以把它了解為一款效率很高但更适合直接操作的一款非關系資料庫,大部分不需要用“腦子”的資料都可以放在MongoDB中,比如很多人把爬蟲的資料存儲到MongoDB中,又或許把網站某些資訊記錄放到MongoDB中。這些資料大一點沒關系,但不建議查詢需要關聯太複雜也不要和ACID的事務扯上關系。

MongoDB就像一個家裡的壯漢,啥髒活累活幹的特别六,也不嫌累,力大如牛,腳步如飛的這種。幹這些體力活用他最好了(速度快、性能好、存儲大檔案),但他有些缺點就是可能每次吃飯吃七八碗幹飯,兩三斤肉(占用記憶體大),并且穿針引線、家裡算賬記事情這些他就不行了,得他夫人來幹這個(關系資料庫)

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

第二關 MongoDB安裝和表結構

知道MongoDB大概是啥和能幹啥之後,就該動手安裝和了解使用了!這關帶你安裝MongoDB和了解MongoDB的表結構。

2.1 MongoDB的安裝

MongoDB的安裝很簡單,這裡就基于windows進行安裝了。到MongoDB

官網

下載下傳

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

然後打開這個下載下傳的檔案,一路next到中間根據需求勾選是否選擇compass,compass是一種MongoDB的可視化管理工具。MongoDB的可視化管理工具比較多,在這裡我們不勾選這塊内容。

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

選擇Custom根據需求自定義安裝:

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

到location可以自定義檔案夾,也可以使用其預設的:

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

下面勾選第一個“連入網絡”即可:

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

這樣,你的MongoDB就安裝完成了,再安裝MongoDB可視化工具:studio3t (

) 下載下傳安裝完成打開直接連接配接

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

此時MongoDB就安裝完成,預設擁有admin、config、local三個資料庫。一些日志配置等資料庫,這裡就不用管它了。

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

2.2 MongoDB的表結構

對于關系資料庫,我們可能很容易了解它的層次: 資料庫——>表——>記錄(行)——>列,而MongoDB對應的是:資料庫——>集合——>文檔——>字段。其中集合可以類比成關系資料庫中的表,而文檔就可以看成記錄。

SQL術語/概念 MongoDB術語/概念 解釋/說明
database 資料庫
table collection 資料庫表/集合
row document 資料記錄行/文檔
column field 資料字段/域
index 索引
table joins 表連接配接,MongoDB不支援
primary key 主鍵,MongoDB自動将_id字段設定為主鍵

文檔:文檔是 MongoDB 中資料的基本機關,類似于JSON對象和關系資料庫中的行(但是比行複雜)。它是由多個資料字段和值對組成的資料結構,字段的值也可以是其他文檔或文檔數組。

集合:集合就是一組文檔,類似于關系資料庫中的表。集合是無模式的,集合中的文檔可以是各式各樣的,雖然一個集合裡面的文檔沒有内容的限制,但是我們一般将相同類型的文檔放在同一集合中(提高查詢效率)。

資料庫:MongoDB 中多個文檔組成集合,多個集合組成資料庫。一個MongoDB 執行個體可以承載多個資料庫。它們之間可以看作互相獨立,每個資料庫都有獨立的權限控制。在磁盤上,不同的資料庫存放在不同的檔案中。MongoDB 中存在以下系統資料庫。

  • Admin 資料庫:一個權限資料庫,如果建立使用者的時候将該使用者添加到admin 資料庫中,那麼該使用者就自動繼承了所有資料庫的權限。
  • Local 資料庫:這個資料庫永遠不會被複制,可以用來存儲本地單台伺服器的任意集合。
  • Config 資料庫:當MongoDB 使用分片模式時,config 資料庫在内部使用,用于儲存分片的資訊。
MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

你可能會發現,在與集合同級别的還有Views,GridFS Buckets。它們是啥呢?

視圖Views: MongoDB視圖是可查詢的對象,其内容由其他集合或視圖上的聚合管道定義 。MongoDB不會将視圖内容持久化到磁盤上。當用戶端查詢視圖時,将按需計算視圖的内容。MongoDB不支援針對視圖的寫入操作。這個和MySQL的視圖有點類似,是個虛表,可以用它來精簡一些查詢的步驟和操作。

GridFS: GridFS是用于存儲和檢索超出BSON文檔大小限制(16MB)的檔案的規範。GridFS不會将檔案存儲在單個文檔中,而是将檔案劃分為多個部分或大塊,并将每個大塊存儲為單獨的文檔。

第三關 MongoDB的增删改查

學習使用MongoDB之前,要掌握MongoDB基本的增删改查操作。我們先用控制台或者資料庫管理工具操作MongoDB,為後面整合進項目做準備。MongoDB随着發展至今也有不同的版本,在MongoDB3.2以後版本相比3.2以前版本api有些變動和優化,而官方文檔的學習和介紹都是基于3.2以後版本的,是以在學習MongoDB的api文法要參考官方文檔學習最新文法,避免過老文法造成知識混淆。

建立資料庫

我們使用studio 3T建立資料庫和collection,資料庫名為mongo。如果不建立資料庫,向mongoDB中插入資料會預設插入到test資料庫中。

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

然後在資料庫中添加集合collection,collection名為student:

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

可以發現student集合已經被成功添加了:

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

MongoDB的讀操作包括查詢,而寫操作包括插入、更新、删除,MongoDB中的所有寫操作都是單個文檔級别的原子操作,你可以指定查詢、更新、删除标準或過濾器(查詢、更新、删除更新的條件),以辨別要查詢、更新、删除的文檔,你可以了解過濾器為關系資料庫的條件查詢的條件where子句。

3.1 MongoDB插入

插入操作完成向集合中插入文檔,MongoDB提供了以下向集合插入文檔的方法:

db.collection.insertOne() //New in version 3.2 插入一條文檔(document)
db.collection.insertMany() //New in version 3.2 插入多條文檔(document)
db.collection.insert()//老版本文法            

其中,collection在插入 時候需改成待插入集合的名稱,待插入文檔(document)需要插入到對應集合(collection)中,否則會預設建立一個集合再插入進去。在這裡我們插入一條文檔到student集合中。

使用mongo資料庫之前要執行語句:

use mongo

,執行完畢即可直接操作mongo資料庫。

MongoDB的insert的文法如下,更推薦使用insertOne和insertMany,分别用來插入一條和多條文檔(document):

向student集合插入單條文檔(document),執行以下語句:

db.student.insertOne({"name": "bigsai","age":"22"})           
MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

插入多條文檔(document),執行以下語句:

db.student.insertMany([{"name": "bigsai2","age":"22"},{"name": "bigsai3","age":"22"}])           
MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

打開student集合,會發現上面的文檔(document)被成功插入了。

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

3.2 MongoDB查詢

查詢操作完成從集合中查詢文檔,MongoDB提供了以下向集合插入文檔的方法:

db.collection.find()//查詢文檔,在括号内添加各種條件           

你可以指定查詢過濾器或條件以辨別要傳回的文檔。當然MongoDB也支援各種條件查詢,使用也非常簡單,具體還需要檢視官方文檔(

https://docs.mongodb.com/manual/tutorial/query-documents/

),這裡以查詢student集合中資料字段age為22的文檔為例,展示一下:

//db.student.find()//查詢所有類似select * from student
db.student.find({"age":"22"})           

可以看到查詢結果如下,所有資料字段age為22的文檔都被查詢了出來。

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

3.3 MongoDB更新

更新操作完成從集合中更新(修改)文檔,MongoDB提供了以下更新集合文檔的方法:

db.collection.updateOne() //3.2版中的新功能 更新一條文檔記錄
db.collection.updateMany() //3.2版中的新功能 更新多條文檔記錄
db.collection.replaceOne() //3.2版中的新功能 替換集合中的一個文檔           

在MongoDB中,更新操作隻針對單個集合(db.collection中對應的collection)。MongoDB中的所有寫操作(包括更新)都是單個文檔級别的原子操作,你可以指定更新标準或過濾器(更新的條件),以辨別要更新的文檔。這些過濾器與查詢使用的過濾器用法一緻。當然MongoDB有update()方法但是已經被棄用。

我們将student集合中所有資料字段age為22的文檔更新其資料字段name的值為bigsai22:

db.student.updateOne(
     {"age":"22"},//條件
     {$set:{"name":"bigsai2"}}//修改的值
 )           

其中{"age":"22"}為查詢的條件即找到第一條資料字段age為22的文檔,而{$set:{}}則用來修改文檔對應資料字段的值。updateOne()執行成功隻會更新第一條比對的文檔。

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

此時,你如果想将資料字段name為

bigsai2

的兩條文檔的資料字段age改成18,那麼執行以下語句:

db.student.updateMany(
     {"name":"bigsai2"},
     {$set:{"age":"18"}}
 )           

重新整理結果會發現文檔已經成功被更新,這種語句在sql中就類似

update student set age=18 where name=bigsai2

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

3.4 MongoDB删除

删除操作完成從集合中删除文檔,MongoDB提供了以下删除集合文檔的方法:

db.collection.deleteOne() //3.2版中的新功能 删除一條記錄
db.collection.deleteMany() //3.2版中的新功能 删除多條記錄           

在MongoDB中,删除操作隻針對單個集合(db.collection中對應的collection)。MongoDB中的所有寫操作(包括删除)都是單個文檔級别的原子操作,你可以指定标準或過濾器,以辨別要删除的文檔。這些過濾器與查詢、更新使用的過濾器用法一緻。

這裡delete和update操作的條件有點類似,如果使用deleteOne()語句會删除第一個比對的文檔,而使用deleteMany()會删除所有滿足條件的文檔。如果我們删除所有資料字段name為bigsai2的文檔可以這麼操作:

db.student.deleteMany(
     {"name":"bigsai2"}//條件
 )           

可以發現文檔被成功删除:

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查

課程總結

到這裡MongoDB的介紹已經結束了,我想優秀的你肯定已經能夠知道MongoDB的來龍去脈了。

回顧本篇的内容,首先,從宏觀上介紹了MongoDB這個非關系型資料庫的特點以及場景;然後介紹了MongoDB的安裝流程以及學習了MongoDB的表結構,進而使你對MongoDB的規則有個更細緻地認識;最後,教你如何使用語句實作MongoDB的增删改查,讓你能夠初步操作MongoDB。

當然,本篇隻是帶你入門MongoDB,講了一些比較基礎的内容,如果需要深入學習使用MongoDB,還需要多從官網文檔以及其他學習資源中更深入地了解!

MongoDB是目前非常熱門的一種基于文檔的非關系型資料庫,它的應用也正變得越來越多。望你在了解MongoDB之後能夠在程式設計語言中盡快實戰使用MongoDB,把MongoDB真正用到項目中!

碼字不易,歡迎關注筆者公衆号支援一波:

bigsai

,期待你的關注願分享更多内容。回複

bigsai

擷取精選pdf資料一份。

MongoDB從立地到成佛(介紹、安裝、增删改查)課程導學第一關 MongoDB介紹第二關 MongoDB安裝和表結構第三關 MongoDB的增删改查