【資料庫寶典 - MongoDB】基礎介紹

閱讀時間約 5 分鐘

我們在「【資料庫寶典】什麼是NoSQL?能吃嗎?」有談到一些NoSQL的特性,雖然本質上有所差異,但兩方技術發展的產品也都開始互相支援了,比如說MongoDB後來也發展出類SQL語法讓熟悉SQL的開發者可以降低進入門檻,而SQL、postgresql…等也紛紛納入一些NoSQL的元素,雙方都有開始接納不同陣營的開發者,就讓我們來好好了解一下MongoDB吧!

與RDBMS的對應

raw-image

圖片來源…

SQL有join, 那mongo呢?

  1. Embedded Document。
  2. Document reference Document。
  3. Aggregate & $lookup。

特性

  • Schema Free, 因應各種不同結構的資料來源。
  • 反正規化, 減少過多的表。
  • 高度相容於javascript, 並以json作為儲存格式。
  • 讀取效能高於寫入效能。
  • Sharding機制, 可以將資料水平切割。

適用場景

  • 網站登入/登出。
  • 快取。
  • 易擴充的系統。
  • Event log。
  • 關聯性較簡單、業務邏輯單純。

不適用場景

  • 高交易需求的系統, 銀行/會計系統, 不嚴謹保證ACID
  • BI應用。

Replica Set

MongoDB 是 NoSQL 的一種,因此也有提供這種高可用性架構。這在 MongoDB 的術語中被稱為 Replica Set

典型的架構

raw-image

圖片來源…

  • 預設所有的請求都是對 Primary 節點進行。
  • Client也可以指定Secondary做為讀取節點。
  • 資料會自動複製到另外兩組 Secondary 節點。
  • 這些節點彼此透過 Heartbeat (每隔一段時間試探節點是否存活的方式) 檢測狀態,正常的情況每 2 秒會送出 Heartbeat,若是超過 10 秒沒有回覆,代表連線故障。如下:
raw-image

圖片來源…

當主要連線的節點發生故障時, mongo有自己的機制, 透過選舉的方式會選出一台 Secondary 成為 Primary 接手工作,這樣的能力稱為 Automatic Failover,如下:

raw-image

圖片來源…

primary到secondary的切換過程中,這一段時間,mongodb是無法提供寫操作的。因此這個時候應用程式需要判斷這些錯誤,然後做retry。

Arbiter

  • 一個 Replica Set 中可以有零個或一個 Arbiter。
  • 不實際儲存資料內容,僅參與選舉的投票,為的是讓選舉可以達成有效人數。
  • 較節省硬體資源。
raw-image

圖片來源…

MongoDB Sharding 簡介

raw-image

圖片來源…

  • 每一個Shard都是由獨立的mongod 實體或者 Replica Set 所構成。
  • Sharding 機制本身是不負責備份的。
  • 建議使用 Replica Set 來搭建 MongoDB Sharded Cluster, 如下。

Sharded Cluster 運作機制

raw-image

圖片來源…

  • Router: 主要處理Client端的請求, 並存取Config Servers來決定要往哪個Shard來存取資料。
  • Config Servers: 儲存集群的位置、資料及分片的關係,建議要有三個實體以上, 因為Meta太重要了。
  • Shard: 實際儲存資料的地方, 可以是單一的mongod也可以是Replica Set。

角色及權限控管(Role Base Access Controller)

raw-image

圖片來源…

對每個創建的user設置對應的角色:

use test // 到test這個db底下建立user
db.createUser({
user: "boss",
pwd: "boss",
roles: [
{
role: "userAdminAnyDatabase",
db: "admin",
},
],
});

也可以自訂角色來對db進行更細部的控管

  • 建立的角色也能繼承其他角色的權限。
  • 每個角色可以對db、collection定義可以執行的操作。
db.createRole({
role: "customRole", // 自訂的角色
privileges: [
{
// 對哪個db裡面的哪個collection配置允許的操作
resource: { db: "users", collection: "usersCollection" },
actions: ["find"], // 允許的操作
},
],
roles: [],
});

MongoDB將角色分類為:

raw-image


raw-image

圖片來源…

結語

簡單的了解一下MongoDB的基礎特性之後,接下來就可以開始玩玩看這套DB囉,實際使用下來還蠻彈性的,但由於過往都被SQL Schema給框住了,突然少了框框條條卻有些不習慣,但這也是MongoDB的特點,提供靈活彈性的操作方式,讓所有可能性賦能給開發者去發揮。


學習軟體開發的路上常常苦於網路資訊爆炸嗎? 教學何其多,但卻遇到無法明確選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您業界開發重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。

112會員
255內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
定義 NoSQL並不是真的不用SQL, 而是常被業界定義為「Not Only SQL」, 也就是說不只能透過類似SQL的API來存取這類DB。 發展NoSQL的原因 由於RDBMS面臨到一些難題如下: 1. Big Data 傳統的RDBMS是設計在單個節點上運作, 因此當資料量越
範例句: 假設我們有一段文章以空白隔開的方式來切割詞彙,內容如下: 假設條件為: clauses:[提升,滿意度,問卷] 。 slop:4。 in_order: true ❗ 這裡的Slop代表範圍內不匹配的最大數量,從開始匹配的字詞框到最後加總一併進行計算。 查詢結構會是如此 請問上述條件是否能正
通常我們如果希望一筆資料是能夠具備唯一性的狀況下, 勢必在新增前會進行檢查, 但是在我們的應用程式中, 先查詢再寫入勢必會造成一些時間差, 導致於多人同時操作時, 可能發生重複資料的狀況。 假設我們的應用是不允許名稱重複, 那我們的資料可能如下: 我們的業務邏輯為「當名稱存在時就更新、不存在就新增」
不論我們使用Nodejs的Mongo Client還是Go語言甚至其他語言的套件, 應該都會看到連線選項中有poolSize這類的配置, 以下會介紹什麼是連線池、優點、應注意的事項。 首先來談談連接池之前的單一連接機制, 在配置正確的狀況下可能不會遇到任何問題, 但假設我們的應用同時間有100個用戶
MongoDB非常擅長查詢大量的數據並經常更新這些資訊, 在多數的情況之下, 我們只要查詢資訊最新的狀態, 那假設我們需要查詢資料的上一個狀態呢? 如果我們需要一些文檔版本控管功能時怎麼辦呢? 這就是我們可以使用版本控管設計模式的地方了。 這個模式之下會保存文檔的歷史版本, 我們就不用導入另外一個版
定義 NoSQL並不是真的不用SQL, 而是常被業界定義為「Not Only SQL」, 也就是說不只能透過類似SQL的API來存取這類DB。 發展NoSQL的原因 由於RDBMS面臨到一些難題如下: 1. Big Data 傳統的RDBMS是設計在單個節點上運作, 因此當資料量越
範例句: 假設我們有一段文章以空白隔開的方式來切割詞彙,內容如下: 假設條件為: clauses:[提升,滿意度,問卷] 。 slop:4。 in_order: true ❗ 這裡的Slop代表範圍內不匹配的最大數量,從開始匹配的字詞框到最後加總一併進行計算。 查詢結構會是如此 請問上述條件是否能正
通常我們如果希望一筆資料是能夠具備唯一性的狀況下, 勢必在新增前會進行檢查, 但是在我們的應用程式中, 先查詢再寫入勢必會造成一些時間差, 導致於多人同時操作時, 可能發生重複資料的狀況。 假設我們的應用是不允許名稱重複, 那我們的資料可能如下: 我們的業務邏輯為「當名稱存在時就更新、不存在就新增」
不論我們使用Nodejs的Mongo Client還是Go語言甚至其他語言的套件, 應該都會看到連線選項中有poolSize這類的配置, 以下會介紹什麼是連線池、優點、應注意的事項。 首先來談談連接池之前的單一連接機制, 在配置正確的狀況下可能不會遇到任何問題, 但假設我們的應用同時間有100個用戶
MongoDB非常擅長查詢大量的數據並經常更新這些資訊, 在多數的情況之下, 我們只要查詢資訊最新的狀態, 那假設我們需要查詢資料的上一個狀態呢? 如果我們需要一些文檔版本控管功能時怎麼辦呢? 這就是我們可以使用版本控管設計模式的地方了。 這個模式之下會保存文檔的歷史版本, 我們就不用導入另外一個版
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
✓ TABLE 備份 ✓ 確認資料已確實備份 ✓ 移除原TABLE ✓ 將資料重新轉入
Thumbnail
【生活話題】要健康VS要隱私!健保資料庫違憲? 本所許惠菁律師主持央廣【生活有辦法】,憲法法庭討論「運用健保資料庫的個人健康資料做醫學研究」是否有違憲。
Thumbnail
最近接獲一個任務,該任務的目標是替一個即將進入正式部署階段的系統,導入一個 database migration tool,以下是此任務整個思考決策的邏輯以及正式進行時技術上比較值得和大家分享的小細節。 系統背景 資料庫的設計方式,目前常見會有兩種方向,code first 以及 database
Thumbnail
UNIX 在設計時,用 32 位元為基礎設計,Timestamp (time_t 結構) 順理成章也是 32 位元 (signed int32),從 1970 年開始算,導致它能記錄的時間在 2038 年會溢位變負數。
Thumbnail
強大的資料照片庫對記者來說,非常重要,發稿時如果沒有搭配照片,那被採用的機會大減,「每一張照片都是未編號的新台幣!」一位同業這樣形容照片庫兼具創造財源的功能。
Thumbnail
重症資料庫 / 加護病房(ICU)資料庫-輔助醫師用於幫助重症加護患者恢復健康
世界上的物質並沒有好壞之分,好與壞只存在於人們的使用目的與方法,但大麻就絕對不是壞,世上也並沒有一個人因為大麻的使用而死亡,相反對大麻的強烈禁制卻殺死了相當多的人。 我所追求的不只是大麻的除罪與合法,更是大麻的普及化。
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
✓ TABLE 備份 ✓ 確認資料已確實備份 ✓ 移除原TABLE ✓ 將資料重新轉入
Thumbnail
【生活話題】要健康VS要隱私!健保資料庫違憲? 本所許惠菁律師主持央廣【生活有辦法】,憲法法庭討論「運用健保資料庫的個人健康資料做醫學研究」是否有違憲。
Thumbnail
最近接獲一個任務,該任務的目標是替一個即將進入正式部署階段的系統,導入一個 database migration tool,以下是此任務整個思考決策的邏輯以及正式進行時技術上比較值得和大家分享的小細節。 系統背景 資料庫的設計方式,目前常見會有兩種方向,code first 以及 database
Thumbnail
UNIX 在設計時,用 32 位元為基礎設計,Timestamp (time_t 結構) 順理成章也是 32 位元 (signed int32),從 1970 年開始算,導致它能記錄的時間在 2038 年會溢位變負數。
Thumbnail
強大的資料照片庫對記者來說,非常重要,發稿時如果沒有搭配照片,那被採用的機會大減,「每一張照片都是未編號的新台幣!」一位同業這樣形容照片庫兼具創造財源的功能。
Thumbnail
重症資料庫 / 加護病房(ICU)資料庫-輔助醫師用於幫助重症加護患者恢復健康
世界上的物質並沒有好壞之分,好與壞只存在於人們的使用目的與方法,但大麻就絕對不是壞,世上也並沒有一個人因為大麻的使用而死亡,相反對大麻的強烈禁制卻殺死了相當多的人。 我所追求的不只是大麻的除罪與合法,更是大麻的普及化。