MongoDB 教程
MongoDB 是一個面向文件的 NoSQL 資料庫,用於大容量資料儲存。在本教程中,你將學習如何訪問 Mongodb 以及它的一些重要功能,如索引,正規表示式,分片資料等。
MongoDB 是一個在 2000 年代中期出現的資料庫。它屬於 NoSQL 資料庫的範疇。
什麼是 MongoDB
- MongoDB 是一個文件資料庫。每個資料庫都包含集合,而集合又包含文件。每個文件可以具有不同數量的欄位。每個文件的大小和內容可以彼此不同。
- 文件結構更符合開發人員在各自的程式語言中構建類和物件的方式。開發人員經常會說他們的類不是行和列,而是具有鍵值對的清晰結構。
- 如 NoSQL 資料庫的介紹中所示,行(或 MongoDB 中所說的文件)不需要事先定義模式。相反,可以動態建立欄位。
- MongoDB 中可用的資料模型允許你更輕鬆地表示層次關係,儲存陣列和其他更復雜的結構。
- 可伸縮性 - MongoDB 環境具有很高的可擴充套件性。世界各地的公司都定義了叢集,其中一些叢集執行著 100 多個節點,資料庫中有大約數百萬個文件
下面的示例顯示瞭如何在 MongoDB 中建模文件。
- MongoDB 新增了_id 欄位,以唯一標識集合中的文件。
- 你可以注意到,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 |
- 你將立即注意到的第一件事是你沒有定義特殊列名的列,而是每個欄位都有一個鍵值對。
- 你會注意到在客戶的表中,前 3 個鍵對於所有 3 行是相同的,但第 4 個鍵(City 和 Status)對於前 2 行是不同的,不適用於第 3 行。
- 同樣,在 Orders 表中,第 2 行和第 3 行沒有為 4 列(裝運日期)定義的值。
這就是 NoSQL 如此特殊和獨特,也非常靈活的原因。在我們充滿活力且不斷變化的技術世界中,企業主現在需要更快的軟體解決方案週轉時間。
通過使用 NoSQL 資料庫等靈活的資料庫,我們可以灌輸更快的週轉時間,因為我們在定義資料的方式上具有更大的靈活性和更少的約束。
想象一下,在為關聯式資料庫中的現有表新增或編輯列所花費的時間與在 NoSQL 資料庫中新增相同數量所需的工作量相比。
MongoDB 中的常用術語
以下是 MongoDB 中使用的一些常用術語
- _id - 這是每個 MongoDB 文件中都需要的欄位。 _id 欄位表示 MongoDB 文件中的唯一值。 _id 欄位就像文件的主鍵。如果你建立一個沒有_id 欄位的新文件,MongoDB 將自動建立該欄位。因此,例如,如果我們看到上述客戶表的示例,Mongo DB 將為集合中的每個文件新增一個 24 位唯一識別符號。
_Id | 客戶 ID | 客戶名稱 | 訂單 ID |
---|---|---|---|
563479cc8a8a4246bd27d784 | 11 | Tastones | 111 |
563479cc7a8a4246bd47d784 | 22 | 特雷弗史密斯 | 222 |
563479cc9a8a4246bd57d784 | 33 | 妮可 | 333 |
-
Collection - 這是一組 MongoDB 文件。集合相當於在任何其他 RDMS(如 Oracle 或 MS SQL)中建立的表。集合存在於單個資料庫中。從引言集中看,不強制執行任何型別的結構。
-
Cursor - 這是一個指向查詢結果集的指標。客戶端可以遍歷遊標以檢索結果。
-
資料庫 - 這是 RDMS 中的集合的容器,其中它是表的容器。每個資料庫都在檔案系統上獲得自己的一組檔案。MongoDB 伺服器可以儲存多個資料庫。
-
文件 - MongoDB 集合中的記錄基本上稱為文件。該文件又由欄位名稱和值組成。
-
欄位 - 文件中的名稱 - 值對。文件包含零個或多個欄位。欄位類似於關聯式資料庫中的列。
-
JSON - 這被稱為 JavaScript 物件表示法。這是一種用於表達結構化資料的人類可讀的純文字格式。許多程式語言目前支援 JSON。
我們再強調一遍,_id 欄位與普通集合欄位之間的主要區別。 _id 欄位用於唯一標識集合中的文件,並在建立集合時由 MongoDB 自動新增。
為什麼要使用 MongoDB
以下是為什麼應該開始使用 MongoDB 的幾個原因
- 面向文件 - 由於 MongoDB 是 NoSQL 型別的資料庫,它不是以關係型別格式儲存資料,而是將資料儲存在文件中。這使得 MongoDB 非常靈活,能夠適應真實的商業環境和要求。
- 即席查詢 - MongoDB 支援按欄位,範圍查詢和正規表示式搜尋進行搜尋。可以進行查詢以返回文件中的特定欄位。
- 索引 - 可以建立索引以提高 MongoDB 中的搜尋效能。可以索引 MongoDB 文件中的任何欄位。
- 複製 - MongoDB 可以為副本集提供高可用性。副本集由兩個或多個 mongo 資料庫例項組成。每個副本整合員可以隨時以主副本副本的角色執行。主副本是主伺服器,它與客戶端互動並執行所有讀/寫操作。輔助副本使用內建複製維護主資料的副本。當主副本失敗時,副本集會自動切換到輔助副本,然後它將成為主伺服器。
- 負載平衡 - MongoDB 使用分片的概念通過在多個 MongoDB 例項之間拆分資料來水平擴充套件。MongoDB 可以執行在多個伺服器上,平衡負載和/或複製資料,以便在硬體發生故障時保持系統正常執行。
資料建模
正如我們在 簡介
部分中看到的那樣,MongoDB 中的資料具有靈活的模式。與[SQL](/ sql.html)資料庫不同,在插入資料之前必須先宣告表的模式,MongoDB 的集合不會強制執行文件結構。這種靈活性使 MongoDB 如此強大。
在 Mongo 中建模資料時,請記住以下事項
- 應用程式的需求是什麼 - 檢視應用程式的業務需求,並檢視應用程式所需的資料和資料型別。在此基礎上,確保相應地確定文件的結構。
- 什麼是資料檢索模式 - 如果你預見到查詢使用量很大,那麼請考慮在資料模型中使用索引來提高查詢效率。
- 資料庫中是否經常發生插入,更新和刪除 - 如果資料建模設計需要,請重新考慮使用索引或合併分片,以提高整個 MongoDB 環境的效率。
MongoDB 和 RDBMS 之間的區別
以下是 MongoDB 和 RDBMS 之間的一些關鍵術語差異
RDBMS | MongoDB 的 | 區別 |
---|---|---|
表 | 採集 | 在 RDBMS 中,表包含用於儲存資料的列和行,而在 MongoDB 中,這種結構稱為集合。該集合包含文件,而文件又包含欄位,而欄位又是鍵值對。 |
行 | 檔案 | 在 RDBMS 中,該行表示表中的單個隱式結構化資料項。在 MongoDB 中,資料儲存在文件中。 |
柱 | 領域 | 在 RDBMS 中,列表示一組資料值。MongoDB 中的這些被稱為 Fields。 |
加盟 | 嵌入式檔案 | 在 RDBMS 中,資料有時會分佈在各種表中,為了顯示所有資料的完整檢視,有時會在表之間形成連線以獲取資料。在 MongoDB 中,資料通常儲存在單個集合中,但使用嵌入式文件分隔。所以在 Mongodb 中沒有連線的概念。 |
除了術語差異外,下面還顯示了一些其他差異
-
已知關聯式資料庫用於實施資料完整性。這不是 MongoDB 中的明確要求。
-
RDBMS 首先要求資料被規範化,以便它可以防止孤立記錄和重複規範化資料然後需要更多的表,這將導致更多的表連線,因此需要更多鍵和索引。
隨著資料庫開始增長,效能可能開始成為一個問題。同樣,這不是 MongoDB 中的明確要求。MongoDB 非常靈活,不需要首先對資料進行規範化。