MongoDB基礎知識梳理

2023-03-29 15:00:32

 

簡介

  • MongoDB 是由 C++ 編寫的開源 NoSQL 和基於檔案的資料庫。MongoDB 提供了面向檔案的儲存方式,操作起來比較簡單和容易,支援「無模式」的資料建模,可以儲存比較複雜的資料型別,是一款非常流行的檔案型別資料庫。
  • MongoDB 是非關係型資料庫當中功能最豐富,最像關係型資料庫的。它支援的資料結構非常鬆散,會將資料儲存為一個檔案,資料結構由鍵值對(key=>value)組成,是類似於json的bson格式,欄位值可以包含其它檔案、陣列和檔案陣列,因此可以儲存比較複雜的資料型別。
  • 在高負載的情況下,MongoDB 天然支援水平擴充套件和高可用,可以很方便地新增更多的節點/範例,以保證服務效能和可用性。在許多場景下,MongoDB 可以用於代替傳統的關係型資料庫或鍵/值儲存方式,皆在為 Web 應用提供可延伸的高可用高效能資料儲存解決方案。

為什麼使用MongoDB

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

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

MongoDB的重要特性

  • 查詢:它支援臨時查詢和基於檔案的查詢。
  • 索引支援:檔案中的任何欄位都可以被索引。
  • 複製:它支援主從複製。MongoDB 使用本機應用程式來維護資料的多個副本。防止資料庫停機是副本集的功能之一,因為它具有自我修復的分片。
  • 多臺伺服器:資料庫可以執行在多臺伺服器上。在硬體故障的情況下,資料被複制以防止系統發生故障。
  • 自動分片:此過程將資料分佈在多個稱為分片的物理分割區中。由於分片,MongoDB 具有自動負載平衡功能。
  • MapReduce:它支援MapReduce和靈活的聚合工具。
  • 故障處理:在 MongoDB 中,很容易處理故障情況。大量的副本提供了更高的保護和資料可用性,以防止資料庫停機,例如機架故障、多臺機器故障和資料中心故障,甚至網路分割區。
  • GridFS:無需使堆疊複雜化,可以儲存任何大小的檔案。GridFS 功能將檔案分成更小的部分並將它們儲存為單獨的檔案。
  • 無模式資料庫:它是一個用 C++ 編寫的無模式資料庫。
  • 面向檔案的儲存:它使用 BSON 格式,這是一種類似 JSON 的格式。
  • 過程: MongoDB JavaScript 執行良好,因為資料庫使用語言而不是過程。

MongoDB 資料型別

  • 字串 -必須是 UTF-8 有效
  • Integer -根據伺服器儲存 32 位或 64 位的數值
  • Boolean -儲存真/假值
  • Double -儲存浮點值
  • Min/Max keys -將值與最低和最高 BSON 元素進行比較
  • Arrays -將陣列、列表或多個值儲存到一個鍵中
  • Date -以 UNIX 格式儲存當前日期或時間
  • 時間戳 -用於記錄檔案的修改或新增
  • 物件 -用於嵌入檔案
  • 物件 ID -儲存檔案的 ID
  • 二進位制資料 -用於儲存二進位制資料
  • Null -儲存空值
  • Symbol -與字串相同,但主要用於具有特定符號型別的語言
  • 程式碼 -用於將 JavaScript 程式碼儲存到檔案中
  • Regular expression -儲存正規表示式

MySQL與 MongoDB 一些對比

資料庫MySQLMongoDB
資料庫模型 關係型 非關係型
儲存方式 不同引擎有不同的儲存方式 以類JSON的檔案的格式儲存
查詢語句 SQL語句 MongoDB查詢方式(類似JavaScript的函數)
資料處理方式 不同引擎有自己的特點 基於記憶體,將熱資料存放在實體記憶體中,從而達到高速讀寫
成熟度 成熟度高 新興資料庫,成熟度較低
廣泛度 開源資料庫,市場份額不斷增長 NoSQL資料庫中,比較完善且開源,使用人數在不斷增長
事務性 支援事務操作 僅支援單檔案事務操作,弱一致性
佔用空間 佔用空間小 佔用空間大
join操作 MySQL支援join MongoDB沒有join

 MySQL與 MongoDB 對應的術語:

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

 

MongoDB 架構

  • 資料庫:簡單來說,可以稱為資料的物理容器。每個資料庫在檔案系統上都有自己的一組檔案,多個資料庫存在於單個 MongoDB 伺服器上。
  • 集合:一組資料庫檔案可以稱為一個集合。RDBMS 相當於一個集合是一個表。整個集合存在於單個資料庫中。涉及集合時沒有模式。在集合中,各種檔案可以有不同的欄位,但集合中的檔案大多用於相同的目的或服務於相同的最終目標。
  • 檔案:一組鍵值對可以指定為一個檔案。檔案與動態模式相關聯。擁有動態模式的好處是單個集合中的檔案不必擁有相同的結構或欄位。此外,集合檔案中的公共欄位可以具有不同型別的資料。

MongoDB核心元件及其用法包括:

  • 集合 —— 它們是一組 MongoDB 檔案。它們的 RDBMS 對應物是表。必須瞭解集合不強制執行任何結構。集合始終存在於單個資料庫中。
  • 檔案 —— 這是一個以 BSON 格式儲存的資料集合。它的 RDBMS 對應物是 Row。MongoDB 中的記錄稱為檔案。MongoDB 中的檔案包含欄位名稱及其對應的值。
  • 欄位 —— 這是 MongoDB 檔案中的單個元素,它包含作為欄位和值對的值。在關聯式資料庫中,欄位類似於列。簡單來說,欄位可以稱為檔案中的名稱-值對。
  • _id   —— 每個 MongoDB 檔案都需要這個欄位。_id 欄位可以等同於關聯式資料庫中的主鍵。它表示 MongoDB 檔案中的唯一範例或值。如果您有意在 MongoDB 中建立一個沒有 _id 欄位的檔案,它將自動生成。
  • 遊標 —— 這是一個指示查詢集合結果的指標。通過遊標的幫助,使用者端可以檢索結果。
  • JSON —— 這是一種 JavaScript 表示法。它是純文字,一種用於表達結構化資料的人類可讀格式。數以千計的程式語言支援 JSON。
  • 資料庫 —— 就像在 RDBMS 中,資料庫是表容器,在 MongoDB 中,資料庫是集合容器。每個資料庫在檔案系統上都包含自己的檔案集。因此,MongoDB 伺服器可以儲存多個資料庫。

MongoDB 的優勢

  • 1. 分散式資料平臺
    • 在地理分佈的資料中心和雲區域中,MongoDB 可以執行以確保更高階別的可用性和可延伸性。
    • 無需停機且無需更改您的應用程式,MongoDB 可在資料量和吞吐量方面進行彈性擴充套件。
    • 該技術為您提供了跨各種資料中心的足夠靈活性,並具有良好的一致性。
  • 2. 快速迭代開發
    • 不斷變化的業務需求將不再影響您企業中專案的成功交付。
    • 具有動態模式的靈活資料模型,以及強大的 GUI 和命令列工具,使開發人員能夠快速構建和發展應用程式。
    • 自動設定支援持續整合和交付以實現生產運營。
    • RDBMS 的靜態關係模式和複雜操作現在已成為過去。
  • 3. 靈活的資料模型
    • MongoDB 將資料儲存在靈活的類 JSON 檔案中,這使得資料持久化和合並變得容易。
    • 應用程式程式碼中的物件被對映到檔案模型,因此處理資料變得容易。
    • 不用說,模式治理控制、資料存取、複雜聚合和豐富的索引功能不會以任何方式受到損害。
    • 無需停機,就可以動態修改架構。
    • 由於這種靈活性,開發人員無需擔心資料操作。
  • 4. 降低 TCO(總擁有成本)
    • 使用 MongoDB 時,應用程式開發人員可以更好地完成工作。
    • 得益於 Atlas Cloud 服務,運營團隊也可以出色地完成工作。
    • 由於 MongoDB 在商品硬體上執行,因此成本顯著降低。
    5.整合功能集
    • 由於分析和資料視覺化、事件驅動的流資料管道、文字和地理空間搜尋、圖形處理、記憶體效能,人們可以獲得各種實時應用程式。
    • RDBMS 要實現這一點,需要額外的複雜技術以及單獨的整合要求。

MongoDB 的缺點

  • 在 MongoDB 中,沒有合併表的方法;因此,每次需要使用此功能時,都必須手動完成,導致編碼難看且耗時。
  • 它使用大量記憶體,因為它必須為每個檔案儲存金鑰,因為可能存在資料衝突。
  • 當您開始使用一項功能時,它會鎖定整個資料庫,從而導致並行問題。
  • 它不會自動執行此操作;因此使用者必須手動確保該操作是一個事務。

場景應用

適用場景

    • 網站資料:Mongo 非常適合實時的插入,更新與查詢,並具備網站實時資料儲存所需的複製及高度伸縮性。
    • 快取:由於效能很高,Mongo 也適合作為資訊基礎設施的快取層。在系統重啟之後,由Mongo 搭建的持久化快取層可以避免下層的資料來源過載。
    • 大尺寸、低價值的資料:使用傳統的關係型資料庫儲存一些資料時可能會比較昂貴,在此之前,很多時候程式設計師往往會選擇傳統的檔案進行儲存。
    • 高伸縮性的場景:Mongo 非常適合由數十或數百臺伺服器組成的資料庫,Mongo 的路線圖中已經包含對MapReduce 引擎的內建支援。
    • 用於物件及JSON 資料的儲存:Mongo 的BSON 資料格式非常適合檔案化格式的儲存及查詢。

不適場景

    • 高度事務性的系統:例如,銀行或會計系統。傳統的關係型資料庫目前還是更適用於需要大量原子性複雜事務的應用程式。
    • 傳統的商業智慧應用:針對特定問題的BI 資料庫會產生高度優化的查詢方式。對於此類應用,資料倉儲可能是更合適的選擇。
    • 需要SQL 的問題。

MongoDB的版本號解釋

MongoDB的版本號分為3位:主版本.次版本.修訂號。

  • 主版本(主要版本):當有重大更新時更新主版本號。例如支援WT引擎時主版本號從2升級到3;支援事務功能時從3升級到4;
  • 次版本(快速釋出):釋出新功能時更新次版本號。以奇數次版本號作為開發版,給大家嚐鮮用,但不應用於生產環境;以偶數次版本號作為穩定版,適合生產環境使用。這就是為什麼大家在下載網站上只看到4.0,4.2,4.4而無法找到4.1,4.3,4.5的原因。
  • 修訂號(修補程式版本):每隔一定時間釋出一次,包含近期內所有的bugfix。修訂號不做任何功能上的更新,只用於釋出bugfix。所以只要主/次版本號一致時,更新修訂號可以完全向前相容。

  主/次版本基本上保持一年一次的更新頻率,修訂號不定期釋出。

MongoDB官方下載網站:

安裝MongoDB社群版

CentOS7準備環境

[root@MongoDB-01 ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@MongoDB-01 ~]# uname -r
3.10.0-1160.83.1.el7.x86_64

[root@MongoDB-01 ~]# systemctl stop firewalld
[root@MongoDB-01 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux
[root@MongoDB-01 ~]# setenforce 0
[root@MongoDB-01 ~]# ntpdate 0.centos.pool.ntp.org
[root@MongoDB-01 ~]# yum install net-tools vim wget curl -y
  • MongoDB 5.x
建立/etc/yum.repos.d/mongodb-org-5.0.repo檔案
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc
# 安裝最新穩定版本的 MongoDB
# yum install -y mongodb-org 
==================================================================================================================================================
# 如要安裝特定版本的 MongoDB,請單獨指定每個元件包並將版本號附加到包名稱,例如
yum install -y mongodb-org-5.0.0 mongodb-org-database-5.0.0 mongodb-org-server-5.0.0 mongodb-org-shell-5.0.0 mongodb-org-mongos-5.0.0 mongodb-org-tools-5.0.0 
# yum當更新版本可用時升級軟體包。為防止意外升級,請固定包。要固定包,請將以下exclude指令新增到您的/etc/yum.conf檔案中
exclude=mongodb-org,mongodb-org-database,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools
==================================================================================================================================================
  • MongoDB 6.x
# 建立/etc/yum.repos.d/mongodb-org-6.0.repo檔案
[root@MongoDB-01 ~]# cat /etc/yum.repos.d/mongodb-org-6.0.repo
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc

# 安裝最新穩定版本的 MongoDB
[root@MongoDB-01 ~]# yum install -y mongodb-org

================================================================================================================================================== # 如要安裝特定版本的 MongoDB,請單獨指定每個元件包並將版本號附加到包名稱,例如 yum install -y mongodb-org-6.0.0 mongodb-org-database-6.0.0 mongodb-org-server-6.0.0 mongodb-org-mongos-6.0.0 mongodb-org-tools-6.0.0 # yum當更新版本可用時升級軟體包。為防止意外升級,請固定包。要固定包,請將以下exclude指令新增到您的/etc/yum.conf檔案中 exclude=mongodb-org,mongodb-org-database,mongodb-org-server,mongodb-mongosh,mongodb-org-mongos,mongodb-org-tools ==================================================================================================================================================
[root@MongoDB-01 ~]# rpm -qa | grep mongodb
mongodb-mongosh-1.8.0-1.el8.x86_64 mongodb-org-database-tools-extra-6.0.5-1.el7.x86_64 mongodb-org-mongos-6.0.5-1.el7.x86_64 mongodb-org-database-6.0.5-1.el7.x86_64 mongodb-database-tools-100.7.0-1.x86_64 mongodb-org-tools-6.0.5-1.el7.x86_64 mongodb-org-server-6.0.5-1.el7.x86_64 mongodb-org-6.0.5-1.el7.x86_64 [root@MongoDB-01 ~]# mongod --version db version v6.0.5 Build Info: { "version": "6.0.5", "gitVersion": "c9a99c120371d4d4c52cbb15dac34a36ce8d3b1d", "openSSLVersion": "OpenSSL 1.0.1e-fips 11 Feb 2013", "modules": [], "allocator": "tcmalloc", "environment": { "distmod": "rhel70", "distarch": "x86_64", "target_arch": "x86_64" } } # 預設組態檔 [root@MongoDB-01 ~]# grep -Ev "^$|#" /etc/mongod.conf systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log storage: dbPath: /var/lib/mongo journal: enabled: true processManagement: timeZoneInfo: /usr/share/zoneinfo net: port: 27017 # 確保執行MongoDB的使用者有權存取 [root@MongoDB-01 ~]# grep mongo /etc/passwd mongod:x:997:996:mongod:/var/lib/mongo:/bin/fals [root@MongoDB-01 ~]# ls -ld /var/log/mongodb/mongod.log /var/lib/mongo drwxr-xr-x 4 mongod mongod 4096 Mar 23 10:24 /var/lib/mongo -rw-r----- 1 mongod mongod 20102 Mar 23 10:24 /var/log/mongodb/mongod.log [root@MongoDB-01 ~]# systemctl start mongod [root@MongoDB-01 ~]# ps aux | grep mongod mongod 1225 14.8 2.3 2659472 93396 ? Ssl 11:54 0:00 /usr/bin/mongod -f /etc/mongod.conf root 1269 0.0 0.0 112808 968 pts/0 S+ 11:54 0:00 grep --color=auto mongod [root@MongoDB-01 ~]# netstat -ntpl | grep mongod tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 1225/mongod [root@MongoDB-01 ~]# systemctl enable mongod
  •  解除安裝MongoDB
[root@MongoDB-01 ~]# systemctl stop mongod
[root@MongoDB-01 ~]# ps aux | grep mongod
root       2129  0.0  0.0 112808   968 pts/0    S+   12:11   0:00 grep --color=auto mongod
[root@MongoDB-01 ~]# yum erase $(rpm -qa | grep mongodb-org)
[root@MongoDB-01 ~]# rm -r /var/log/mongodb
[root@MongoDB-01 ~]# rm -r /var/lib/mongo 


Ubuntu準備環境

root@ubuntu-1804:~# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.6 LTS
Release:	18.04
Codename:	bionic
root@ubuntu-1804:~# 
root@ubuntu-1804:~# uname -r
4.15.0-163-generic

root@ubuntu-1804:~# ufw disable
Firewall stopped and disabled on system startup
root@ubuntu-1804:~# ufw status
Status: inactive
root@ubuntu-1804:~# apt list --installed | grep mongo
  • MongoDB 5.x
# 匯入金鑰
root@ubuntu-1804:~# apt-get install gnupg root@ubuntu-1804:~# wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | apt-key add - # 建立/etc/apt/sources.list.d/mongodb-org-5.0.list檔案 root@ubuntu-1804:~# echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list root@ubuntu-1804:~# apt-get update # 安裝最新穩定版本的 MongoDB root@ubuntu-1804:~# apt-get install -y mongodb-org ======================================================================================================================================================================= # 如要安裝特定版本的 MongoDB,請單獨指定每個元件包並將版本號附加到包名稱,例如 sudo apt-get install -y mongodb-org=5.0.0 mongodb-org-database=5.0.0 mongodb-org-server=5.0.0 mongodb-org-shell=5.0.0 mongodb-org-mongos=5.0.0 mongodb-org-tools=5.0.0 # apt-get當更新版本可用時升級軟體包。為防止意外升級,請固定包。 root@ubuntu-1804:~# echo "mongodb-org hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-database hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-server hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-shell hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-mongos hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-tools hold" | sudo dpkg --set-selections =======================================================================================================================================================================
  • MongoDB 6.x  
# 匯入金鑰
root@ubuntu-1804:~# apt-get install gnupg
root@ubuntu-1804:~# wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
OK
# 建立/etc/apt/sources.list.d/mongodb-org-5.0.list檔案
root@ubuntu-1804:~# echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
root@ubuntu-1804:~# apt-get update

# 安裝最新穩定版的 MongoDB
root@ubuntu-1804:~# apt-get install -y mongodb-org
=======================================================================================================================================================================
# 如要安裝特定版本的 MongoDB,請單獨指定每個元件包並將版本號附加到包名稱,例如
root@ubuntu-1804:~# apt-get install -y mongodb-org=6.0.0 mongodb-org-database=6.0.0 mongodb-org-server=6.0.0 mongodb-org-mongos=6.0.4 mongodb-org-tools=6.0.0
# apt-get當更新版本可用時升級軟體包。為防止意外升級,請固定包。
root@ubuntu-1804:~# echo "mongodb-org hold" | sudo dpkg --set-selections
root@ubuntu-1804:~# echo "mongodb-org-database hold" | sudo dpkg --set-selections
root@ubuntu-1804:~# echo "mongodb-org-server hold" | sudo dpkg --set-selections
root@ubuntu-1804:~# echo "mongodb-org-shell hold" | sudo dpkg --set-selections
root@ubuntu-1804:~# echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
root@ubuntu-1804:~# echo "mongodb-org-tools hold" | sudo dpkg --set-selections
=======================================================================================================================================================================

root@ubuntu-1804:~# mongod --version
db version v6.0.5
Build Info: {
    "version": "6.0.5",
    "gitVersion": "c9a99c120371d4d4c52cbb15dac34a36ce8d3b1d",
    "openSSLVersion": "OpenSSL 1.1.1  11 Sep 2018",
    "modules": [],
    "allocator": "tcmalloc",
    "environment": {
        "distmod": "ubuntu1804",
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}

 常用命令