MongoDB 基礎知識梳理

簡介
- 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 一些對比
| 數據庫 | MySQL | MongoDB |
|---|---|---|
| 數據庫模型 | 關系型 | 非關系型 |
| 存儲方式 | 不同引擎有不同的存儲方式 | 以類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
<br>==================================================================================================================================================
# 如要安裝特定版本的 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
==================================================================================================================================================
<br>[root@MongoDB-01 ~]# rpm -qa | grep mongodb<br>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:~# 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
- MongoDB 5.x
# 導入密鑰<br>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"
}
}
常用命令

********** 如果您認為這篇文章還不錯或者有所收獲,請點擊右下角的【推薦】/【贊助】按鈕,因為您的支持是我繼續創作分享的最大動力! **********
作者:講文張字
出處:http://www.rzrgm.cn/zhangwencheng
版權:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出 原文鏈接
出處:http://www.rzrgm.cn/zhangwencheng
版權:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出 原文鏈接
浙公網安備 33010602011771號