MongoDB 教程

MongoDB 是一個面向文件的 NoSQL 資料庫,用於大容量資料儲存。在本教程中,你將學習如何訪問 Mongodb 以及它的一些重要功能,如索引,正規表示式,分片資料等。

MongoDB 是一個在 2000 年代中期出現的資料庫。它屬於 NoSQL 資料庫的範疇。

什麼是 MongoDB

  1. MongoDB 是一個文件資料庫。每個資料庫都包含集合,而集合又包含文件。每個文件可以具有不同數量的欄位。每個文件的大小和內容可以彼此不同。
  2. 文件結構更符合開發人員在各自的程式語言中構建類和物件的方式。開發人員經常會說他們的類不是行和列,而是具有鍵值對的清晰結構。
  3. 如 NoSQL 資料庫的介紹中所示,行(或 MongoDB 中所說的文件)不需要事先定義模式。相反,可以動態建立欄位。
  4. MongoDB 中可用的資料模型允許你更輕鬆地表示層次關係,儲存陣列和其他更復雜的結構。
  5. 可伸縮性 - MongoDB 環境具有很高的可擴充套件性。世界各地的公司都定義了叢集,其中一些叢集執行著 100 多個節點,資料庫中有大約數百萬個文件

下面的示例顯示瞭如何在 MongoDB 中建模文件。

  1. MongoDB 新增了_id 欄位,以唯一標識集合中的文件。
  2. 你可以注意到,RDBMS 中的訂單資料(訂單 ID、產品和數量)通常儲存在單獨的表中,而在 MongoDB 中,它實際上作為嵌入文件儲存在集合本身中。這是 MongoDB 中資料建模方式的主要區別之一。
{
    _id : <objectId> ,
    CustomerName : Guru99 ,
    Order:
    		{
    			OrderID: 111 
    			Product: ProductA 
    			Quantity: 5
    		}
}

NoSQL 意味著什麼

NoSQL 不是關聯式資料庫。它提供了更大的靈活性,因為所有記錄都不受整個表中定義的相同列名和型別的限制。下面的例子將更好地瞭解 NoSQL 是什麼。

以下 2 個表是 Customer 表和 Order 表的簡單示例,其中 Customer 表通過關係連結到 Order 表。

  • 客戶表
客戶 ID 客戶名稱 訂單 ID
11 Tastones 111
22 特雷弗史密斯 222
33 妮可 333
  • 訂單表
訂單 ID 產品 數量
111 ProductA 5
222 ProductB 8
333 ProductC 10

在 NoSQL 中,表可能看起來像下面所示的表

  • 客戶表
CustomerID 11 CustomerName Guru99 OrderID 111 City US
CustomerID 22 CustomerName Trevor Smith OrderID 222 Status Privilege
CustomerID 33 CustomerName Nicole OrderID 333 Status Privilege
  • 訂單表
OrderID 111 Product ProductA Quantity 5 Shipment Date 22-Mar-15
OrderID 222 Product ProductB Quantity 8
OrderID 333 Product ProductC Quantity 10
  1. 你將立即注意到的第一件事是你沒有定義特殊列名的列,而是每個欄位都有一個鍵值對。
  2. 你會注意到在客戶的表中,前 3 個鍵對於所有 3 行是相同的,但第 4 個鍵(City 和 Status)對於前 2 行是不同的,不適用於第 3 行。
  3. 同樣,在 Orders 表中,第 2 行和第 3 行沒有為 4 列(裝運日期)定義的值。

這就是 NoSQL 如此特殊和獨特,也非常靈活的原因。在我們充滿活力且不斷變化的技術世界中,企業主現在需要更快的軟體解決方案週轉時間。

通過使用 NoSQL 資料庫等靈活的資料庫,我們可以灌輸更快的週轉時間,因為我們在定義資料的方式上具有更大的靈活性和更少的約束。

想象一下,在為關聯式資料庫中的現有表新增或編輯列所花費的時間與在 NoSQL 資料庫中新增相同數量所需的工作量相比。

MongoDB 中的常用術語

以下是 MongoDB 中使用的一些常用術語

  1. _id - 這是每個 MongoDB 文件中都需要的欄位。 _id 欄位表示 MongoDB 文件中的唯一值。 _id 欄位就像文件的主鍵。如果你建立一個沒有_id 欄位的新文件,MongoDB 將自動建立該欄位。因此,例如,如果我們看到上述客戶表的示例,Mongo DB 將為集合中的每個文件新增一個 24 位唯一識別符號。
_Id 客戶 ID 客戶名稱 訂單 ID
563479cc8a8a4246bd27d784 11 Tastones 111
563479cc7a8a4246bd47d784 22 特雷弗史密斯 222
563479cc9a8a4246bd57d784 33 妮可 333
  1. Collection - 這是一組 MongoDB 文件。集合相當於在任何其他 RDMS(如 Oracle 或 MS SQL)中建立的表。集合存在於單個資料庫中。從引言集中看,不強制執行任何型別的結構。

  2. Cursor - 這是一個指向查詢結果集的指標。客戶端可以遍歷遊標以檢索結果。

  3. 資料庫 - 這是 RDMS 中的集合的容器,其中它是表的容器。每個資料庫都在檔案系統上獲得自己的一組檔案。MongoDB 伺服器可以儲存多個資料庫。

  4. 文件 - MongoDB 集合中的記錄基本上稱為文件。該文件又由欄位名稱和值組成。

  5. 欄位 - 文件中的名稱 - 值對。文件包含零個或多個欄位。欄位類似於關聯式資料庫中的列。

  6. JSON - 這被稱為 JavaScript 物件表示法。這是一種用於表達結構化資料的人類可讀的純文字格式。許多程式語言目前支援 JSON。

我們再強調一遍,_id 欄位與普通集合欄位之間的主要區別。 _id 欄位用於唯一標識集合中的文件,並在建立集合時由 MongoDB 自動新增。

為什麼要使用 MongoDB

以下是為什麼應該開始使用 MongoDB 的幾個原因

  1. 面向文件 - 由於 MongoDB 是 NoSQL 型別的資料庫,它不是以關係型別格式儲存資料,而是將資料儲存在文件中。這使得 MongoDB 非常靈活,能夠適應真實的商業環境和要求。
  2. 即席查詢 - MongoDB 支援按欄位,範圍查詢和正規表示式搜尋進行搜尋。可以進行查詢以返回文件中的特定欄位。
  3. 索引 - 可以建立索引以提高 MongoDB 中的搜尋效能。可以索引 MongoDB 文件中的任何欄位。
  4. 複製 - MongoDB 可以為副本集提供高可用性。副本集由兩個或多個 mongo 資料庫例項組成。每個副本整合員可以隨時以主副本副本的角色執行。主副本是主伺服器,它與客戶端互動並執行所有讀/寫操作。輔助副本使用內建複製維護主資料的副本。當主副本失敗時,副本集會自動切換到輔助副本,然後它將成為主伺服器。
  5. 負載平衡 - MongoDB 使用分片的概念通過在多個 MongoDB 例項之間拆分資料來水平擴充套件。MongoDB 可以執行在多個伺服器上,平衡負載和/或複製資料,以便在硬體發生故障時保持系統正常執行。

資料建模

正如我們在 簡介 部分中看到的那樣,MongoDB 中的資料具有靈活的模式。與[SQL](/ sql.html)資料庫不同,在插入資料之前必須先宣告表的模式,MongoDB 的集合不會強制執行文件結構。這種靈活性使 MongoDB 如此強大。

在 Mongo 中建模資料時,請記住以下事項

  1. 應用程式的需求是什麼 - 檢視應用程式的業務需求,並檢視應用程式所需的資料和資料型別。在此基礎上,確保相應地確定文件的結構。
  2. 什麼是資料檢索模式 - 如果你預見到查詢使用量很大,那麼請考慮在資料模型中使用索引來提高查詢效率。
  3. 資料庫中是否經常發生插入,更新和刪除 - 如果資料建模設計需要,請重新考慮使用索引或合併分片,以提高整個 MongoDB 環境的效率。

MongoDB 和 RDBMS 之間的區別

以下是 MongoDB 和 RDBMS 之間的一些關鍵術語差異

RDBMS MongoDB 的 區別
採集 在 RDBMS 中,表包含用於儲存資料的列和行,而在 MongoDB 中,這種結構稱為集合。該集合包含文件,而文件又包含欄位,而欄位又是鍵值對。
檔案 在 RDBMS 中,該行表示表中的單個隱式結構化資料項。在 MongoDB 中,資料儲存在文件中。
領域 在 RDBMS 中,列表示一組資料值。MongoDB 中的這些被稱為 Fields。
加盟 嵌入式檔案 在 RDBMS 中,資料有時會分佈在各種表中,為了顯示所有資料的完整檢視,有時會在表之間形成連線以獲取資料。在 MongoDB 中,資料通常儲存在單個集合中,但使用嵌入式文件分隔。所以在 Mongodb 中沒有連線的概念。

除了術語差異外,下面還顯示了一些其他差異

  1. 已知關聯式資料庫用於實施資料完整性。這不是 MongoDB 中的明確要求。

  2. RDBMS 首先要求資料被規範化,以便它可以防止孤立記錄和重複規範化資料然後需要更多的表,這將導致更多的表連線,因此需要更多鍵和索引。

隨著資料庫開始增長,效能可能開始成為一個問題。同樣,這不是 MongoDB 中的明確要求。MongoDB 非常靈活,不需要首先對資料進行規範化。