目錄
主要特點
MongoDB概念解析
完整術語列表
MongoDB安裝
MongoDB Shell
安裝MongoDB Shell
數據庫管理
查看數據庫列表
創建數據庫
刪除數據庫
默認數據庫
系統內置數據庫
集合管理
查看集合
創建集合
更新集合名
刪除集合
文檔操作
插入文檔
查詢文檔
刪除文檔
更新文檔
MongoDB備份(mongodump)與恢復(mongorestore)
安裝備份與恢復命令
MongoDB數據備份
MongoDB數據庫恢復
MongoDB用戶管理
主要特點
文檔導向的存儲:MongoDB是一個面向文檔的數據庫,它以JSON-like的格式存儲數
據,使得數據結構更加靈活和豐富。
索引優化查詢:MongoDB允許用戶為文檔中的任意屬性創建索引,例如FirstName和A
ddress,從而提高查詢效率和排序性能。
數據鏡像與擴展性:通過本地或網絡創建數據的副本,MongoDB實現了強大的數據冗余
和擴展能力。水平擴展與分片:面對增加的負載,MongoDB可以通過分片技術將數據分布到計算機網絡中的其他節點上,實現水平擴展。
強大的查詢語言:MongoDB使用JSON格式的查詢語法,支持復雜的查詢表達式,包括
對內嵌對象和數組的查詢。數據更新:利用 update()命令,MongoDB能夠替換整個文檔或更新指定的數據字段,MapReduce批量處理:MongoDB的MapReduce功能專為大規模數據處理和聚合操作設計,通過Map函數的emit(key,value)
調用和Reduce函數的邏輯處理,實現高效的
數據匯總。MapReduce腳本編寫:Map和Reduce函數使用JavaScript編寫,可以通過
db. ru或mapreduce命令在MongoDB中執行。
nCommandGridFS大文件存儲:GridFS是MongoDB內置的功能,用于存儲和檢索大于BSON文檔大小限制的文件,如圖片和視頻。
服務端腳本執行:MongoDB允許在服務端執行JavaScript腳本不,提供了直接在服務端
執行或存儲函數定義以供后續調用的能力。
多語言支持:MongoDB提供了對多種編程語言的支持,包括但不限于RUBY、PYTHON、JAVA、C++、PHP和C#。
MongoDB概念解析
SQL術語/概念 | MongoDB 術語/概念 | 解釋/說明 |
database | database | 數據庫 |
table | collection | 數據庫表/集合 |
row | document | 數據記錄行/文檔 |
column | field | 數據字段/域 |
index | index | 索引 |
table joins | 表連接,MongoDB不支持 | |
primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |
完整術語列表
文檔(Document):MongoDB的基本數據單元,通常是一個JSSON-1ike的結構,可以包含
多種數據類型。集合(Collection):類似于關系型數據庫中的表,集合是一組文檔的容器。在MongoDB中,一個集合中的文檔不需要有一個固定的模式。
數據庫(Database):包含一個或多個集合的MongoDB實例。
BSON:BinaryJSON的縮寫,是MongoDB用來存儲和傳輸文檔的二進制形式的JSON
索引(Index):用于優化查詢性能的數據結構,可以基于集合中的一個或多個字段創建索
引。分片(Sharding):一種分布數據到多個服務器(稱為分片)的為方法,用于處理大數據集和高吞吐量應用。副本集(ReplicaSet):一組維護相同數據集的MongoDB服務器,提供數據的冗余備份和高可用性。主節點(Primary):副本集中負責處理所有寫入操作的服務器。從節點(Secondary):副本集中的服務器,用于該取數據和在主節點故障時接管為主節點。MongoDBShell:MongoDB提供的命令行界面,用于與MongoDB實例交互。
聚合框架(AggregationFramework):用于執行復雜的數據處理和聚合操作的一系列操作。Map-Reduce:一種編程模型,用于處理大量數據集的并行計算。
GridFS:用于存儲和檢索大于BSON文檔大小限制的文件的規范。ObjectId:MongoDB為每個文檔自動生成的唯一標識符。CRUD操作:創建(Create)、讀取(Read)、更新(Update)、刪除(Delete)操作。事務(Transactions):從MongoDB4.0開始支持,允許一組操作作為一個原子單元執行。操作符(0perators):用于查詢和更新文檔的特殊字段。
連接(Join):MongoDB 允許在查詢中使用$1ookup操作符來實現類似SQL的連接操作。
TTL(Time-To-Live):可以為集合中的某些字段設置 TTL,!以自動刪除舊數據。
存儲引擎(Storage Engine):MongoDB用于數據存儲和管理的底層技術,如WiredTiger
和MongoDB的舊存儲引擎MMAPv1。MongoDB Compass:MongoDB的圖形界面工具,用于可視化和管理MongoDB數據。MongoDBAtlas:MongoDB提供的云服務,允許在云中托管MoongoDB數據庫。
MongoDB安裝
安裝前我們需要安裝各個Linux平臺依賴包。解壓安裝包將解壓包拷貝到指定目錄MongoDB的可執行文件位于bin目錄下,所以可以將其添加到PATH路徑中:
dnf -y install libcurl openssl
tar zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
mv mongodb-linux-x86_64-rhel88-8.0.8 /usr/local/mongodb
echo
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >>/etc/profile source /etc/profile
?我們在啟動前可以先創建這兩個目錄并設置當前用戶有讀寫權限:由于 mongodb 依賴openssl11,需要編譯安裝openssl11設置 openssl11的環境變量接下來啟動 Mongodb 服務:看到以下信息,說明啟動成功。
[root@localhost ~]#mkdir-p /var/lib/mongo
[root@localhost ~]#mkdir -p /var/log/mongodb
[root@localhost ~]#chownwhoami`/var/lib/mongo
[root@localhost ~]#chownwhoami /var/log/mongodb
[root@localhost ^]# dnf install -y gcc make perl
[root@localhost `]# tar xzf openssl-1.1.1w.tar.gz
[root@localhost ^]# cd openssl-1.1. l lw
[rootesentinel01 openss1-1.1.1w]#./config --prefix=/opt/openss111 --openssldir=
/opt/openss111/ssl
[root@sentinel01openssl-1.1.1.1w]#make -j$(nproc)
[root@sentinel01 openssl-1.1.1w]#make install
[root@localhost *]# echo 'export_D_LIBRARYPATH=/opt/openss111/lib:$LD_LIBRARY
PATH' | sudo tee /etc/profile.d/openssl11.sh
[root@localhost ~]# source /etc/profile.d/opensslll.sh
[root@localhost ~]#mongod --dbpath /var/lib/mongo --logpath/var/log/mongodb/m
ongod. log --fork
MongoDB Shell
MongoDBShell是MongoDB提供的官方交互式界面,允許用戶與MongoDB數據庫進行
交互、執行命令和操作數據庫。
MongoDBShell是基于JavaScript的,允許用戶直接在命令行或者腳本中使用Java
Script語言來操作MongoDB數據庫。
安裝MongoDB Shell
[root@localhost ^]# tar xzf mongosh-2.5.0-linux-x64-openss13tg2
[root@localhost ^]# cd mongosh-2.5.0-linux-x64-openss13
[root@localhost mongosh-2.5.0-linux-x64-openss13]# cd bin/
[root@localhost bin]# cp mongosh /usr/local/bin/
[root@localhost bin]# cp mongosh_crypt_vl.so /usr/loca/1ib/
? ? ? ? ? ? ? ? ?驗證MongoDB Shell?
mongosh -- host <hostname> ----port <port>
root@sentinel01 bin]# mongosh
數據庫管理
查看數據庫列表
要查看當前MongoDB實例中所有數據庫的列表,可以使用
show dbs
show dbs
要查看當前正在使用的數據庫,可以使用 db 命令:
db
創建數據庫
在MongoDB中,數據庫的創建是一個簡單的過程,當你首次向MongoDB中插入數據時,
如果數據庫不存在,MongoDB會自動創建它。
我們只需選擇一個數據庫名稱,并開始向其中插入文檔即可。
當你使用use命令來指定一個數據庫時,如果該數據庫不存在,MongoDB將自動創建它。
MongoDB 創建數據庫的語法格式如下:
use DATABASE_NAME
test> use runoob
switched to db runoob
runoob> db
runoob
runoob>
?
runoob>
show dbs
admin
40.00KiB
config
60.00KiB
local
40.00 KiB
runoob
?
runoob> db.runoob.insert0ne({"name":"zhangsan"})
acknowledged: true,
insertedId: ObjectId('680al8f4277aalc07blb2700'
runoob>
show dbs.
admin
40.00KiB
config
60.00KiB
local
40.00KiB
runoob
40.00KiB
runoob>
刪除數據庫
如果你需要刪除數據庫,可以使用db.dropDatabase方法:
use myDatabase
db.dropDatabase ()
?
runoob> show dbs
admin
40.00KiB
config
60.00KiB
local
40.00KiB
runoob 40.00 KiB
runoob> use runoob
already on db runoob
test> db.dropDatabase()
{ ok: 1, dropped: 'runoob
runoob> show dbs
admin
40.00KiB
config
60.00KiB
local
40.00KiB
默認數據庫
MongoDB中默認的數據庫為test,如果你沒有創建新的數據庫庫,數據將存放在test
數據庫中。當您通過shell連接到MongoDB實例時,如果未使用use命令切換到其他數據庫,則會默認使用test數據庫。
例如,在啟動MongoDB實例并連接到MongoDBshell后,如果您開始插入文檔而未顯
式指定數據庫,MongoDB將默認使用 test數據庫。
系統內置數據庫
在MongoDB中,admin、config 和 local
是三個特殊的系統內置數據庫
數據庫:存儲所有數據庫的用戶身份信息和全局權限(如 rcbot
用戶)。用admin戶必須通過
admin數據庫認證后才能執行跨庫管理操作。
數據庫:僅在分片集群環境中存在。存儲分片信息、塊(chur1k)分布、集合
config分片策略等關鍵元數據。
local數據庫:存儲當前節點的副本集狀態、操作日志(opl0g)等本地數據。數據不
會被復制到其他節點,僅存在于當前實例。
集合管理
查看集合
> show collections
創建集合
語法格式:
db.createCollection (name, options)
參數說明:
name:要創建的集合名稱。
options:可選參數,指定有關內存大小及索引的選項。
參數名 | 類型 | 描述 | 示例值 |
capped | 布爾值 | 是否創建一個固定大小的集合。 | true |
size | 數值 | 集合的最大大小(以字節為單位)。僅在d 為true 時有效。 :cappe | 10485760 (10MB) |
max | 數值 | 集合中允許的最大文檔數。僅在capped 為tru 5000e 時有效。 | 5000 |
validator | 對象 | 用于文檔驗證的表達式。 | {$jsonSchema: { ... }} |
validationLevel | 字符串 | 指定文檔驗證的嚴格程度。 "off":不進行驗證。 "strict":插入和更新操作都必須通過驗證(默認)。 "moderate":僅現有文檔更新時必須通過驗證,插 入新文檔時不需要。 | "strict" |
validationAction | 字符串 | 指定文檔驗證失敗時的操作。 "error":阻止插入或更新(默認)。 warn":允許插入或更新,但會發出警告。 | "error" |
storageEngine | 對象 | 為集合指定存儲引擎配置。 | { wiredTiger: { ... }} |
參數名 | 類型 | 描述 | 示例值 |
collation | 對象 | 指定集合的默認排序規則 | { locale: "en" strength: 2 } ? |
?
db.createCollection ("myComplexCollection",
capped: true,
size: 10485760,
max: 5000,
validator:{$jsonSchema: {
bsonType:"object",
required: ["name", "email"],
properties:{
name:
bsonType:
string",
description:"必須為字符串且為必填項"
email: {
bsonType: "string",
pattern:
description:"必須為有效的電子郵件地址"
}},
validationLevel:"strict",
validationAction:"error",
storageEngine: {
wiredTiger:{configString: "block_compressor=zstd
},
collation:{locale:"en", strength:2}
});
更新集合名
renameCollection命令的語法:
db.adminCommand({
renameCollection: "sourceDb. sourceCollection",
to: "targetDb.targetCollection
dropTarget: <boolean>
參數說明:
renameCollection:要重命名的集合的完全限定名稱(包括數據庫名)。
·to:目標集合的完全限定名稱(包括數據庫名)。
dropTarget(可選):布爾值。如果目標集合已經存在,是否否刪除目標集合。默認值為f
alse.
1.確保已連接到 test數據庫
use test
2.運行renameCollection命
db.adminCommand({
renameCollection: "test.oldCollection",
to:"test.newCollection" });
如果你要將集合重命名到另一個數據庫,例如將test數據庫中的oldCollection重命名
為production數據庫中的newCollection,可以這樣做:
db.adminCommand({
renameCollection: "test.oldCollection",
to:"production. newCollection" });
刪除集合
>use mydb
switched to db
>db.createCollection("kgc")
{ok:1}
mydb>show collections
kgc
>db.kgc.drop()
true
文檔操作
方法 | 用途 | 是否棄用 |
insertone () | 插入單個文檔 | 否 |
方法 | 用途 | 是否棄用 |
insertMany() | 插入多個文檔 | 否 |
insert () | 插入單個或多個文檔 | 是 |
save | 插入或更新文檔 | 是 |
?
db.myCollection. insertOne({
"Alice",
name
25,
age:
city: "New York"
插入文檔
查詢文檔
db.myCollection.find();
db.myCollection.find(
$gt: 25 } },
age:
age: 1, id: 0 }
name:
刪除文檔
常用的刪除文檔方法包括deleteOne()、deleteMany
以及findOneAndDelete
db.myCollection.findOneAndDelete(
name:
"Charlie"
projection:
1.
name:
age:
更新文檔
在MongoDB中,更新文檔的操作可以使用多種方法實現,常用的方法包括
updateOne()、updateMany()、replaceOne()和findOneAndUpdate()。
插入測試數據
db. myCollection. insertMany([{ name: "Alice", age: 25,city: "LosAngeles", statu
"inactive" },{name: "Bob",age: 30,city: "Los Angeles",status:
"active"
S:
"Charlie", age: 35, city: "Chicago", status:
"active"}]);
name:
MongoDB備份(mongodump)與恢復(mongorestore)
mongodump
?用于創建 MongoDB 數據的二進制備份,支持全量備份或指定庫 / 集合的增量備份
# 全量備份(默認連接 localhost:27017)
mongodump --out /path/to/backup/directory# 指定主機和端口
mongodump --host example.com --port 27017 --out /backup/dir# 指定認證信息(用戶名和密碼)
mongodump --username admin --password yourpassword --authenticationDatabase admin --out /backup/dir# 備份單個數據庫
mongodump --db mydatabase --out /backup/dir# 備份單個集合
mongodump --db mydatabase --collection mycollection --out /backup/dir# 壓縮輸出(4.2+ 版本支持)
mongodump --gzip --out /backup/dir
?
恢復數據庫 (mongorestore
)
mongorestore
?用于從?mongodump
?創建的備份中恢復數據
# 從備份目錄恢復(默認恢復到 localhost:27017)
mongorestore /path/to/backup/directory# 指定目標主機和端口
mongorestore --host example.com --port 27017 /backup/dir# 指定認證信息
mongorestore --username admin --password yourpassword --authenticationDatabase admin /backup/dir# 恢復到指定數據庫(可重命名目標庫)
mongorestore --db targetdb /backup/dir/sourcedb# 恢復單個集合
mongorestore --db targetdb --collection mycollection /backup/dir/sourcedb/mycollection.bson# 恢復時不刪除現有數據(追加模式)
mongorestore --drop # 恢復前刪除同名集合(默認行為)
mongorestore --noDrop # 保留現有數據,追加新文檔# 從壓縮備份恢復
mongorestore --gzip /backup/dir
安裝備份與恢復命令
使用 Homebrew(推薦)
# 安裝 MongoDB Database Tools
brew tap mongodb/brew
brew install mongodb-database-tools
手動下載二進制包
從?MongoDB 官網?下載適合 macOS 的?.tgz
?包解壓并移動到系統路徑
tar -zxvf mongodb-database-tools-macos-x86_64-<version>.tgz
sudo cp mongodb-database-tools-macos-x86_64-<version>/bin/* /usr/local/bin/
?Ubuntu/Debian
# 添加 MongoDB 官方倉庫
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update# 安裝 Database Tools
sudo apt-get install -y mongodb-database-tools
CentOS/RHEL
?
# 添加 MongoDB 官方倉庫
echo "[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" | sudo tee /etc/yum.repos.d/mongodb-org-6.0.repo# 安裝 Database Tools
sudo yum install -y mongodb-database-tools
MongoDB數據備份
# 全量備份(默認 localhost:27017)
mongodump --out /data/backup/$(date +%Y%m%d)# 指定認證信息和壓縮
mongodump --username admin --password 'pass' \--authenticationDatabase admin \--gzip --out /data/backup/$(date +%Y%m%d)
?
# 1. 凍結寫入(臨時阻塞寫操作)
use admin
db.fsyncLock()# 2. 創建文件系統快照(如 LVM、云磁盤快照)
lvcreate -L 10G -s -n mongodb_snap /dev/mapper/vg_mongodb-lv_data# 3. 解除凍結
db.fsyncUnlock()
# 首次全量備份(含 oplog)
mongodump --oplog --out /data/backup/full_$(date +%Y%m%d)# 后續增量備份(從上次 oplog 時間點開始)
LATEST_OPLOG_TIME=$(cat /data/backup/full_*/oplog.bson | bsondump | tail -n 1 | jq -r '.ts.$timestamp.t')
mongodump --oplogReplay --oplogLimit "{'ts': {'\$gt': Timestamp($LATEST_OPLOG_TIME, 1)}}" --out /data/backup/incremental_$(date +%Y%m%d)
MongoDB數據庫恢復
使用?mongorestore
?恢復邏輯備份
從?mongodump
?創建的備份中恢復數據
# 恢復全部數據庫(默認覆蓋同名集合)
mongorestore /path/to/backup/directory# 指定目標數據庫(可重命名)
mongorestore --db newdb /path/to/backup/olddb# 恢復單個集合
mongorestore --db targetdb --collection users /path/to/backup/sourcedb/users.bson# 恢復時保留現有數據(追加模式)
mongorestore --noDrop /path/to/backup
MongoDB用戶管理
創建管理員用戶(首次配置)
啟動 MongoDB 服務(未啟用認證)
mongod --dbpath /data/db
連接 MongoDB 并創建管理員用戶:
use admin
db.createUser({user: "admin",pwd: passwordPrompt(), // 交互式輸入密碼roles: [ { role: "root", db: "admin" } ]
})
db.auth("admin", passwordPrompt()) // 返回 1 表示認證成功
用戶管理操作
?創建普通用戶
use mydb // 切換到目標數據庫
db.createUser({user: "appuser",pwd: passwordPrompt(),roles: [{ role: "readWrite", db: "mydb" }, // 讀寫權限{ role: "read", db: "otherdb" } // 只讀權限]
})