目錄
什么是mongodb
主要特點
MongoDB 概念解析
完整術語列表
MongoDB 安裝
MongoDB Shell
安裝 MongoDB Shell
驗證 MongoDB Shell
數據庫管理
查看數據庫列表
創建數據庫
實例
刪除數據庫
實例
默認數據庫
系統內置數據庫
集合管理
查看集合
創建集合
實例
更新集合名
renameCollection?命令的語法:
參數說明:
實例
刪除聚合
語法格式:
實例
文檔操作
常用的插入文檔方法包括:
insertOne()
參數說明:
實例
insertMany()
參數說明:
實例
查詢文檔
find () 方法
參數說明:
查找所有文檔:
說明:
說明:
findOne () 方法
除文檔刪
deleteOne()
deleteMany()
語法:
實例
findOneAndDelete()
語法:
實例
更新文檔
updateOne()
語法:
實例
updateMany()
語法:
實例
replaceOne()
語法:
實例
MongoDB 備份 (mongodump) 與恢復 (mongorestore)
安裝備份與恢復命令
?MongoDB 數據備份
MongoDB 數據恢復
MongoDB 用戶管理
連接到 MongoDB
?切換到目標數據庫
創建用戶
驗證用戶
啟用身份驗證
使用用戶身份登錄
刪除用戶
實例操作
什么是mongodb
MongoDB 是一個文檔型數據庫,數據以類似 JSON 的文檔形式存儲。
MongoDB 的設計理念是為了應對大數據量、高性能和靈活性需求。
MongoDB 使用集合(Collections)來組織文檔(Documents),每個文檔都是由鍵值對組成的。
- 數據庫(Database):存儲數據的容器,類似于關系型數據庫中的數據庫。
- 集合(Collection):數據庫中的一個集合,類似于關系型數據庫中的表。
- 文檔(Document):集合中的一個數據記錄,類似于關系型數據庫中的行(row),以 BSON 格式存儲。
MongoDB 將數據存儲為一個文檔,數據結構由鍵值 (key=>value) 對組成,文檔類似于 JSON 對象,字段值可以包含其他文檔,數組及文檔數組:
主要特點
- 文檔導向的存儲:MongoDB 是一個面向文檔的數據庫,它以 JSON-like 的格式存儲數據,使得數據結構更加靈活和豐富。
- 索引優化查詢:MongoDB 允許用戶為文檔中的任意屬性創建索引,例如 FirstName 和 Address,從而提高查詢效率和排序性能。
- 數據鏡像與擴展性:通過本地或網絡創建數據的副本,MongoDB 實現了強大的數據冗余和擴展能力。
- 水平擴展與分片:面對增加的負載,MongoDB 可以通過分片技術將數據分布到計算機網絡中的其他節點上,實現水平擴展。
- 強大的查詢語言:MongoDB 使用 JSON 格式的查詢語法,支持復雜的查詢表達式,包括對內嵌對象和數組的查詢。
- 數據更新:利用 update () 命令,MongoDB 能夠替換整個文檔或更新指定的數據字段,
- MapReduce 批量處理:MongoDB 的 MapReduce 功能專為大規模數據處理和聚合操作設計,通過 Map 函數的 emit (key, value) 調用和 Reduce 函數的邏輯處理,實現高效的數據匯總。
- MapReduce 腳本編寫:Map 和 Reduce 函數使用 JavaScript 編寫,可以通過 db.runCommand 或 mapreduce 命令在 MongoDB 中執行。
- GridFS 大文件存儲: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 的基本數據單元,通常是一個 JSON-like 的結構,可以包含多種數據類型。
集合(Collection):類似于關系型數據庫中的表,集合是一組文檔的容器。在 MongoDB 中,一個集合中的文檔不需要有一個固定的模式。
數據庫(Database):包含一個或多個集合的 MongoDB 實例。
BSON:Binary JSON 的縮寫,是 MongoDB 用來存儲和傳輸文檔的二進制形式的 JSON。
索引(Index):用于優化查詢性能的數據結構,可以基于集合中的一個或多個字段創建索引。
分片(Sharding):一種分布數據到多個服務器(稱為分片)的方法,用于處理大數據集和高吞吐量應用。
副本集(Replica Set):一組維護相同數據集的 MongoDB 服務器,提供數據的冗余備份和高可用性。
主節點(Primary):副本集中負責處理所有寫入操作的服務器。
從節點(Secondary):副本集中的服務器,用于讀取數據和在主節點故障時接管為主節點。
MongoDB Shell:MongoDB 提供的命令行界面,用于與 MongoDB 實例交互。
聚合框架(Aggregation Framework):用于執行復雜的數據處理和聚合操作的一系列操作。
Map-Reduce:一種編程模型,用于處理大量數據集的并行計算。
GridFS:用于存儲和檢索大于 BSON 文檔大小限制的文件的規范。
ObjectId:MongoDB 為每個文檔自動生成的唯一標識符。
CRUD 操作:創建(Create)、讀取(Read)、更新(Update)、刪除(Delete)操作。
事務(Transactions):從 MongoDB 4.0 開始支持,允許一組操作作為一個原子單元執行。
操作符(Operators):用于查詢和更新文檔的特殊字段。
連接(Join):MongoDB 允許在查詢中使用 $lookup 操作符來實現類似 SQL 的連接操作。
TTL(Time - To - Live):可以為集合中的某些字段設置 TTL,以自動刪除舊數據。
存儲引擎(Storage Engine):MongoDB 用于數據存儲和管理的底層技術,如 WiredTiger 和 MongoDB 的舊存儲引擎 MMAPv1。
MongoDB Compass:MongoDB 的圖形界面工具,用于可視化和管理 MongoDB 數據。
MongoDB Atlas:MongoDB 提供的云服務,允許在云中托管 MongoDB 數據庫。
MongoDB 安裝
MongoDB 的安裝過程簡單直觀,便于用戶快速部署和使用。MongoDB 提供了 linux 各個發行版本 64 位的安裝包,你可以在官網下載安裝包。
安裝前我們需要安裝各個 Linux 平臺依賴包
dnf install libcurl openssl -y
解壓安裝包
ar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
將解壓包拷貝到指定目錄
mv mongodb-linux-x86_64-rhel88-8.0.8 /usr/local/mongodb
MongoDB 的可執行文件位于 bin 目錄下,所以可以將其添加到 PATH 路徑中:
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >>/etc/profile
source /etc/profile
創建數據庫目錄
默認情況下 MongoDB 啟動后會初始化以下兩個目錄:
- 數據存儲目錄:/var/lib/mongodb
- 日志文件目錄:/var/log/mongodb
我們在啟動前可以先創建這兩個目錄并設置當前用戶有讀寫權限:
[root@localhost ~]#mkdir -p /var/lib/mongo
[root@localhost ~]#mkdir -p /var/log/mongodb
[root@localhost ~]#chown `whoami` /var/lib/mongo # 設置權限
[root@localhost ~]#chown `whoami` /var/log/mongodb # 設置權限
由于 mongodb 依賴 openssl11,需要編譯安裝 openssl11
[root@localhost ~]# dnf install -y gcc make perl
[root@localhost ~]# tar xzf openssl-1.1.1w.tar.gz
[root@localhost ~]# cd openssl-1.1.1w
[root@sentinel01 openssl-1.1.1w]#./config --prefix=/opt/openssl11 --openssldir=/opt/openssl11/ssl
[root@sentinel01 openssl-1.1.1w]#make -j$(nproc)
[root@sentinel01 openssl-1.1.1w]#make install
接下來啟動 Mongodb 服務:
[root@localhost ~]# mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
看到以下信息,說明啟動成功。
MongoDB Shell
MongoDB Shell 是 MongoDB 提供的官方交互式界面,允許用戶與 MongoDB 數據庫進行交互、執行命令和操作數據庫。
MongoDB Shell 是基于 JavaScript 的,允許用戶直接在命令行或者腳本中使用 JavaScript 語言來操作 MongoDB 數據庫。
安裝 MongoDB Shell
解壓安裝包,將 bin 目錄中 mongosh 二進制文件復制到 PATH 變量中列出的目錄中,例如 /usr/local/bin:
[root@localhost ~]# tar xzf mongosh-2.5.0-linux-x64-openssl3.tgz
[root@localhost ~]# cd mongosh-2.5.0-linux-x64-openssl3
[root@localhost mongosh-2.5.0-linux-x64-openssl3]# cd bin/
[root@localhost bin]# cp mongosh /usr/local/bin/
[root@localhost bin]# cp mongosh_crypt_v1.so /usr/local/lib/
驗證 MongoDB Shell
打開你的終端并使用 mongosh 命令連接到 MongoDB 服務器:
mongosh --host <hostname> --port <port>
說明:
- mongosh:啟動 MongoDB Shell 命令行工具。
- --host <hostname>:指定 MongoDB 服務器的主機名或 IP 地址。
- <hostname>:MongoDB 服務器的主機名(如?localhost)或 IP 地址(如 127.0.0.1)。
- --port <port>:指定 MongoDB 服務器的端口號。
- <port>:MongoDB 服務器監聽的端口號,默認端口是 27017。
輸入 mongosh 默認連接本地 mongodb 數據庫,看到以下信息說明登錄成功,warnings 警告為優化提醒,可以暫時忽略,如若生產環境部署需要處理
plaintext
[root@sentinel01 bin]# mongosh
Current Mongosh Log ID: 680a1533277aa1c07b1b26ff
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.5.0
Using MongoDB: 8.0.8
Using Mongosh: 2.5.0For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/The server generated these startup warnings when booting
2025-04-24T18:22:55.898280+08:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prod-notes-filesystem
2025-04-24T18:22:55.898280+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
2025-04-24T18:22:55.898280+08:00: You are running this process as the root user, which is not recommended2025-04-24T18:22:55.898280+08:00: This server is bound to localhost. Remote systems will be unable to connect to this server. Start the server with --bind_ip <address> to specify which IP addresses it should serve responses from, or with --bind_ip_all to bind to all interfaces. If this behavior is desired, start the server with --bind_ip 127.0.0.1 to disable this warning
2025-04-24T18:22:55.898280+08:00: Soft rlimits too low
2025-04-24T18:22:55.898280+08:00: For customers running the database memory allocator we suggest changing the contents of the following sysctl file
2025-04-24T18:22:55.898280+08:00: We suggest setting the contents of /proc/sys/vm/zone_reclaim_mode to 0 or 1, as a
wapping can cause performance problems.test>
數據庫管理
查看數據庫列表
要查看當前 MongoDB 實例中所有數據庫的列表,可以使用?show dbs
?命令:
> show dbs
要查看當前正在使用的數據庫,可以使用?db
?命令:
> db
創建數據庫
在 MongoDB 中,數據庫的創建是一個簡單的過程,當你首次向 MongoDB 中插入數據時,如果數據庫不存在,MongoDB 會自動創建它。
我們只需選擇一個數據庫名稱,并開始向其中插入文檔即可。
當你使用?use
?命令來指定一個數據庫時,如果該數據庫不存在,MongoDB 將自動創建它。
MongoDB 創建數據庫的語法格式如下:
use DATABASE_NAME
如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。
實例
以下實例我們創建了數據庫 runoob:
test> use runoob
switched to db runoob
runoob> db
runoob
runoob>
執行 use runoob 命令后,MongoDB 將創建名為 runoob 的新數據庫。此時,你可以開始在這個數據庫中創建集合和插入文檔。
如果你想查看所有數據庫,可以使用 show dbs 命令:
runoob> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
runoob>
可以看到,我們剛創建的數據庫 runoob 并不在數據庫的列表中,要顯示它,我們需要向 runoob 數據庫插入一些數據。
runoob> db.runoob.insertOne({"name":"zhangsan"})
{acknowledged: true,insertedId: ObjectId('680a18f4277aa1c07b1b2700')
}
runoob> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
runoob 40.00 KiB
runoob>
刪除數據庫
如果你需要刪除數據庫,可以使用?db.dropDatabase()
?方法:
use myDatabase
db.dropDatabase()
上述命令將刪除當前正在使用的 myDatabase 數據庫及其所有集合。
實例
runoob> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
runoob 40.00 KiB
runoob> use runoob
already on db runoob
test> db.dropDatabase()
{ ok: 1, dropped: 'runoob' }
runoob> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
默認數據庫
MongoDB 中默認的數據庫為 test,如果沒有創建新的數據庫,數據將存放在 test 數據庫中。
當通過 shell 連接到 MongoDB 實例時,如果未使用 use 命令切換到其他數據庫,則會默認使用 test 數據庫。
例如,在啟動 MongoDB 實例并連接到 MongoDB shell 后,如果開始插入文檔而未顯式指定數據庫,MongoDB 將默認使用 test 數據庫。
系統內置數據庫
在 MongoDB 中,admin、config 和 local 是三個特殊的系統內置數據庫
- admin 數據庫:存儲所有數據庫的用戶身份信息和全局權限(如 root 用戶)。用戶必須通過 admin 數據庫認證后才能執行跨庫管理操作。
- config 數據庫:僅在分片集群環境中存在。存儲分片信息、塊(chunk)分布、集合分片策略等關鍵元數據。
- local 數據庫:存儲當前節點的副本集狀態、操作日志(oplog)等本地數據。數據不會被復制到其他節點,僅存在于當前實例。
集合管理
查看集合
查看當前庫已有集合,可以使用?show collections
?或?show tables
?命令
> show collections
創建集合
MongoDB 中使用?createCollection()
?方法來創建集合。
語法格式:
db.createCollection(name, options)
參數說明:
name
:要創建的集合名稱。options
:可選參數,指定有關內存大小及索引的選項。
options
?可以是如下參數:
參數名 | 類型 | 描述 | 示例值 |
---|---|---|---|
capped | 布爾值 | 是否創建一個固定大小的集合。 | true |
size | 數值 | 集合的最大大小(以字節為單位)。僅在?capped ?為?true ?時有效。 | 10485760(10MB) |
max | 數值 | 集合中允許的最大文檔數。僅在?capped ?為?true ?時有效。 | 5000 |
validator | 對象 | 用于文檔驗證的表達式。 | { $jsonSchema: { ... } } |
validationLevel | 字符串 | 指定文檔驗證的嚴格程度。"off" :不進行驗證。"strict" :插入和更新操作都必須通過驗證(默認)。"moderate" :僅現有文檔更新時必須通過驗證,插入新文檔時不需要。 | "strict" |
validationAction | 字符串 | 指定文檔驗證失敗時的操作。"error" :阻止插入或更新(默認)。"warn" :允許插入或更新,但會發出警告。 | "error" |
storageEngine | 對象 | 為集合指定存儲引擎配置。 | { wiredTiger: { ... } } |
collation | 對象 | 指定集合的默認排序規則。 | { locale: "en", strength: 2 } |
在插入文檔時,MongoDB 首先檢查固定集合的?size
?字段,然后檢查?max
?字段。
使用這些選項創建一個集合的實例:
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 }
});
這個例子創建了一個集合,具有以下特性:
固定大小,最大 10MB,最多存儲 5000 個文檔。
文檔必須包含 name 和 email 字段,其中 name 必須是字符串,email 必須是有效的電子郵件格式。
驗證級別為嚴格,驗證失敗將阻止插入或更新。
使用 WiredTiger 存儲引擎,指定塊壓縮器為 zstd。
默認使用英語排序規則。
實例
在 test 數據庫中創建 runoob 集合:
> use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }
注意: 在 MongoDB 中,集合只有在內容插入后才會創建,就是說,創建集合(數據表)后要再插入一個文檔(記錄),集合才會真正創建。
更新集合名
在 MongoDB 中,不能直接通過命令來重命名集合。
MongoDB 可以使用?renameCollection
?方法來重命名集合。
renameCollection
?命令的語法:
db.adminCommand({renameCollection: "sourceDb.sourceCollection",to: "targetDb.targetCollection",dropTarget: <boolean>
})
參數說明:
renameCollection
:要重命名的集合的完全限定名稱(包括數據庫名)。to
:目標集合的完全限定名稱(包括數據庫名)。dropTarget
(可選):布爾值。如果目標集合已經存在,是否刪除目標集合。默認值為?false
。
實例
假設你要將 test 數據庫中的 oldCollection 重命名為 newCollection,可以按以下步驟進行:
確保已連接到 test 數據庫
use test
運行 renameCollection 命令
db.adminCommand({renameCollection: "test.oldCollection",to: "test.newCollection" });
如果你要將集合重命名到另一個數據庫,例如將 test 數據庫中的 oldCollection 重命名為 production 數據庫中的 newCollection,可以這樣做:
db.adminCommand({renameCollection: "test.oldCollection",to: "production.newCollection" });
刪除聚合
MongoDB 中使用?drop()
?方法來刪除集合。
drop()
?方法可以永久地從數據庫中刪除指定的集合及其所有文檔,這是一個不可逆的操作,因此需要謹慎使用。
語法格式:
db.collection名稱.drop()
如果成功刪除選定集合,則?drop()
?方法返回?true
,否則返回?false
。
實例
在數據庫?mydb
?中,我們可以先通過?show collections
?命令查看已存在的集合:
>use mydb
switched to db
>db.createCollection("kgc")
{ ok: 1 }
mydb>show collections
kgc
接著刪除集合?kgc
?:
>db.kgc.drop()
true
通過?show collections
?再次查看數據庫?mydb
?中的集合:
>show collections
從結果中可以看出?kgc
?集合已被刪除。
文檔操作
文檔的數據結構和 JSON 基本一樣。所有存儲在集合中的數據都是 BSON 格式。BSON 是一種類似 JSON 的二進制形式的存儲格式,是 Binary JSON 的簡稱。
常用的插入文檔方法包括:
方法 | 用途 | 是否棄用 |
---|---|---|
insertOne() | 插入單個文檔 | 否 |
insertMany() | 插入多個文檔 | 否 |
insert() | 插入單個或多個文檔 | 是 |
save() | 插入或更新文檔 | 是 |
在 MongoDB 中,插入文檔時如果集合(Collection)不存在,數據庫會自動創建該集合。這是 MongoDB 的默認行為,也是其無模式設計(Schema-less)的核心特性之一
insertOne()
insertOne()
?方法用于在集合中插入單個文檔。
db.collection名稱.insertOne(document, options)
參數說明:
document
:要插入的單個文檔。options
(可選):一個可選參數對象,可以包含?writeConcern
?和?bypassDocumentValidation
?等。
實例
db.myCollection.insertOne({name: "Alice",age: 25,city: "New York"
});
返回結果
{"acknowledged": true,"insertedId": ObjectId("60c72b2f9b1d8b5af8e2b2d")
}
insertMany()
insertMany()
?方法用于在集合中插入多個文檔。
db.collection.insertMany(documents, options)
參數說明:
documents
:要插入的文檔數組。options
(可選):一個可選參數對象,可以包含?ordered
、writeConcern
?和?bypassDocumentValidation
?等。
實例
插入多個文檔的示例(示例未完整展示 )。
db.myCollection.insertMany([{ name: "Bob", age: 30, city: "Los Angeles" },// 可繼續添加更多文檔...
]);
返回結果:
{"acknowledged": true,"insertedIds": [ObjectId("60c72b2f9b1d8b5af8e2b2e"),ObjectId("60c72b2f9b1d8b5af8e2b2f")]
}
查詢文檔
MongoDB 查詢文檔使用?find()
、findOne()
?方法。
find () 方法
find()
?方法以非結構化的方式來顯示所有文檔。
MongoDB 查詢數據的語法格式如下:
db.collection.find(query, projection)
參數說明:
query
:用于查找文檔的查詢條件。默認為?{}
,即匹配所有文檔。projection
(可選):指定返回結果中包含或排除的字段。
查找所有文檔:
實例
db.myCollection.find();
按條件查找文檔:
db.myCollection.find({ age: { $gt: 25 } });
說明:
?
$gt
?是 MongoDB 的比較操作符,表示 “大于”(Greater Than)。
這個條件的作用是篩選出 age 字段值大于 25 的文檔。
類似的其他比較操作符
$gt
(大于)、$lt
(小于)、$gte
(大于等于)、$lte
(小于等于)$eq
(等于)、$ne
(不等于)
按條件查找文檔,并只返回指定字段:
實例
db.myCollection.find({ age: { $gt: 25 } },{ name: 1, age: 1, _id: 0 }
);
說明:
{ name: 1, age: 1, _id: 0 }
?- 投影(Projection)
用于控制返回的字段(類似 SQL 中的 SELECT 語句):1
?表示包含該字段,0
?表示排除該字段。例如?_id: 0
?表示排除默認返回的?_id
?字段。所以最終返回的文檔僅包含?name
?和?age
?字段。
如果你需要以易讀的方式來讀取數據,可以使用?pretty()
?方法,語法格式如下:
>db.myCollection.find().pretty()
pretty()
?方法以格式化的方式來顯示所有文檔。
findOne () 方法
findOne()
?方法用于查找集合中的單個文檔。如果找到多個匹配的文檔,它只返回第一個。
語法
db.collection.findOne(query, projection)
query
:用于查找文檔的查詢條件。默認為?{}
,即匹配所有文檔。projection
(可選):指定返回結果中包含或排除的字段。
查詢單個文檔:
db.myCollection.findOne({ name: "Alice" });
查詢單個文檔,并只返回指定字段:
db.myCollection.findOne({ name: "Alice" },{ name: 1, age: 1, _id: 0 }
);
除文檔刪
常用的刪除文檔方法包括?deleteOne()
、deleteMany()
?以及?findOneAndDelete()
。
deleteOne()
deleteOne()
?方法用于刪除匹配過濾器的單個文檔。
語法:
db.myCollection.findOne({ name: "Alice" });
參數說明:
filter
:用于查找要刪除的文檔的查詢條件。options
(可選):一個可選參數對象。
實例
db.collection.deleteOne(filter, options)
返回結果:
{"acknowledged": true,"deletedCount": 1
}
deleteMany()
deleteMany()
?方法用于刪除所有匹配過濾器的文檔。
語法:
db.collection.deleteMany(filter, options)
filter
:用于查找要刪除的文檔的查詢條件。options
(可選):一個可選參數對象。
實例
db.myCollection.deleteMany({ name: "Bob" });
返回結果
{"acknowledged": true,"deletedCount": 1
}
findOneAndDelete()
findOneAndDelete()
?方法用于查找并刪除單個文檔,并可以選擇返回刪除的文檔。
語法:
db.collection.findOneAndDelete(filter, options)
filter
:用于查找要刪除的文檔的查詢條件。options
:可選參數對象,如?projection
、sort
?等。
實例
db.myCollection.findOneAndDelete({ name: "Charlie" },{ projection: { name: 1, age: 1 } }
);
findOneAndDelete
?返回被刪除的文檔,如果找不到匹配的文檔,則返回?null
。
更新文檔
在 MongoDB 中,更新文檔的操作可以使用多種方法實現,常用的方法包括?updateOne()
、updateMany()
、replaceOne()
?和?findOneAndUpdate()
。
插入測試數據
db.myCollection.insertMany([{ name: "Alice", age: 25, city: "Los Angeles", status: "inactive" },{ name: "Bob", age: 30, city: "Los Angeles", status: "active" },{ name: "Charlie", age: 35, city: "Chicago", status: "active" }
]);
預先插入用于演示更新操作的測試文檔數據。
updateOne()
updateOne()
?方法用于更新匹配過濾器的單個文檔。
語法:
db.collection.updateOne(filter, update, options)
參數說明:
filter
:用于查找文檔的查詢條件。update
:指定更新操作的文檔或更新操作符。options
:可選參數對象,如?upsert
、arrayFilters
?等。
實例
db.myCollection.updateOne({ name: "Alice", // 過濾條件age: { $ne: 26 } // 過濾條件}, { $set: { age: 26 } }, // 更新操作{ upsert: false } // 可選參數
);
upsert
?選項:
false
(默認值):若沒有匹配文檔,不執行任何操作。true
:若未找到匹配文檔,將插入一個新文檔(合并查詢條件和更新操作的內容)。
例如本案例,不匹配時會插入新文檔?{ name: "Alice", age: 26 }
。
更新單個文檔:
db.myCollection.updateOne({ name: "Alice" },{ $set: { age: 28 } }
);
updateMany()
updateMany()
?方法用于更新所有匹配過濾器的文檔。
語法:
db.collection.updateMany(filter, update, options)
參數說明:
filter
:用于查找文檔的查詢條件。update
:指定更新操作的文檔或更新操作符。options
:可選參數對象,如?upsert
、arrayFilters
?等。
實例
db.myCollection.updateMany({ age: { $lt: 30 } }, // 過濾條件{ $set: { status: "active" } },// 更新操作{ upsert: false } // 可選參數
);
更新多個文檔:
db.myCollection.updateMany({ age: { $lt: 30 } },{ $set: { status: "active" } }
);
replaceOne()
replaceOne()
?方法用于替換匹配過濾器的單個文檔,新的文檔將完全替換舊的文檔。
語法:
db.collection.replaceOne(filter, replacement, options)
參數說明:
filter
:用于查找文檔的查詢條件。replacement
:新的文檔,將替換舊的文檔。options
:可選參數對象,如?upsert
?等。
實例
db.myCollection.findOneAndUpdate({ name: "Charlie" }, // 過濾條件{ $set: { age: 30 } }, // 更新操作{ returnDocument: "after" } // 可選參數,返回更新后的文檔
);
查找并更新單個文檔
db.myCollection.findOneAndUpdate({ name: "Charlie" },{ $set: { age: 30 } },{ returnDocument: "after" }
);
MongoDB 備份 (mongodump) 與恢復 (mongorestore)
安裝備份與恢復命令
[root@localhost ~]# rpm -ivh mongodb-database-tools-rhel8-x86_64-100.6.0.rpm
?MongoDB 數據備份
在 MongoDB 中使用?mongodump
?命令來備份數據,該命令可導出所有數據到指定目錄中。
mongodump
?命令可通過參數指定導出的數據所屬的服務器。
?mongodump
?命令的基本語法:
mongodump -h dbhost -d database -o dbdirectory
-h
:指定 MongoDB 所在服務器地址,例如:127.0.0.1,當然也可以指定端口號:127.0.0.1:27017-d
:指定要備份的數據庫實例,例如:test-o
:指定備份數據的存放位置,例如:/data/dump,當然該目錄需要提前建立,當備份完成后,系統自動在dump目錄下建立一個test目錄,這個目錄里存放該數據庫實例的備份數據。
[root@localhost ~]# mongodump
執行?mongodump
?命令后,客戶端會連接到?ip
?為?127.0.0.1
、端口號為?27017
?的 MongoDB 服務上,并備份所有數據到命令執行所在目錄下的?dump/
?目錄中
[root@localhost ~]# mongodump
2025-04-25T22:44:21.307+0800 writing admin.system.version to dump/admin/system.version.bson
2025-04-25T22:44:21.307+0800 done dumping admin.system.version (1 document)
2025-04-25T22:44:21.308+0800 writing mydb.myCollection to dump/mydb/myCollection.bson
2025-04-25T22:44:21.308+0800 writing test.myComplexCollection to dump/test/myComplexCollection.bson
2025-04-25T22:44:21.310+0800 writing test.myCollection to dump/test/myCollection.bson
2025-04-25T22:44:21.313+0800 done dumping test.myCollection (3 documents)
2025-04-25T22:44:21.313+0800 done dumping test.myComplexCollection (0 documents)
2025-04-25T22:44:21.334+0800 done dumping mydb.myCollection (3 documents)
[root@localhost ~]# ls
dump
mongodump 命令可選參數列表
語法 | 描述 | 實例(部分顯示) |
---|---|---|
mongodump --host HOST_NAME --port PORT_NUMBER | 備份所有 MongoDB 數據 | mongodump --host runoob.com --port 27017 |
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY | (描述未完整顯示 ) | mongodump --dbpa... |
mongodump --collection COLLECTION --db DB_NAME | 備份指定數據庫的集合 | mongodump --collection mycol -d test |
MongoDB 數據恢復
MongoDB 使用?mongorestore
?命令恢復備份數據,
?mongorestore
?命令腳本語法如下:
mongorestore -h <hostname><:port> -d dbname <path>
--host <:port>
/-h <:port>
:MongoDB 所在服務器地址,默認?localhost:27017
。--db
/-d
:需恢復的數據庫實例,如?test
,可與備份時名稱不同(舉例?test2
?)。--drop
:恢復前先刪除目標數據庫數據,備份后添加 / 修改的數據會被刪除,慎用。<path>
:mongorestore
?最后一個參數,設置備份數據所在位置(舉例?c:\data\dump\test
?),不能與?--dir
?同時用。--dir
:指定備份目錄,不能與?<path>
?同時用。
執行以下命令:
[root@localhost ~]# mongorestore
mongorestore
?默認從當前執行命令路徑下的?dump
?目錄中讀取備份數據。
執行以上命令輸出結果如下:
[root@localhost ~]# mongorestore
2025-04-25T22:50:28.111+0800 using default 'dump' directory
2025-04-25T22:50:28.111+0800 preparing collections to restore from
2025-04-25T22:50:28.111+0800 don't know what to do with file "dump/prelude.json", skipping...
2025-04-25T22:50:28.111+0800 reading metadata for mydb.myCollection from dump/mydb/myCollection.metadata.json
2025-04-25T22:50:28.111+0800 reading metadata for test.myCollection from dump/test/myCollection.metadata.json
2025-04-25T22:50:28.111+0800 reading metadata for test.myComplexCollection from dump/test/myComplexCollection.metadata.json
2025-04-25T22:50:28.125+0800 restoring test.myCollection from dump/test/myCollection.bson
2025-04-25T22:50:28.134+0800 restoring mydb.myCollection from dump/mydb/myCollection.bson
2025-04-25T22:50:28.136+0800 finished restoring test.myCollection (3 documents, 0 failures)
2025-04-25T22:50:28.140+0800 restoring test.myComplexCollection from dump/test/myComplexCollection.bson
2025-04-25T22:50:28.148+0800 finished restoring mydb.myCollection (3 documents, 0 failures)
2025-04-25T22:50:28.151+0800 finished restoring test.myComplexCollection (0 documents)
2025-04-25T22:50:28.151+0800 no indexes to restore for collection mydb.myCollection
2025-04-25T22:50:28.151+0800 no indexes to restore for collection test.myCollection
2025-04-25T22:50:28.151+0800 no indexes to restore for collection test.myComplexCollection
2025-04-25T22:50:28.151+0800 6 document(s) restored successfully. 0 document(s) failed to restore.
MongoDB 用戶管理
在 MongoDB 中進行用戶管理涉及用戶的創建、分配角色、認證和登錄等操作。以下是使用 MongoDB Shell(mongosh
?)進行用戶管理的詳細說明,包括創建用戶、分配角色、認證和登錄的具體步驟。
連接到 MongoDB
mongosh
?切換到目標數據庫
use test
創建用戶
使用?db.createUser
?命令創建用戶并分配角色。
示例:創建名為?testuser
、密碼為?password123
?的用戶,賦予?readWrite
?和?dbAdmin
?角色(需替換?<database_name>
?為實際數據庫名 )。
db.createUser({user: "testuser",pwd: "password123",roles: [{ role: "readWrite", db: "<database_name>" },{ role: "dbAdmin", db: "<database_name>" }]
})
驗證用戶
創建用戶后,使用?db.auth
?命令驗證用戶身份,傳入用戶名和密碼進行認證。
db.auth("testuser", "password123")
啟用身份驗證
為確保只有經過身份驗證的用戶能訪問 MongoDB,需啟用身份驗證。
編輯 MongoDB 配置文件?mongod.conf
,添加內容:
security:authorization: "enabled"
重啟 MongoDB 服務使更改生效;
或在啟動命令中添加認證參數
mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
使用用戶身份登錄
啟用身份驗證后,用創建的用戶身份連接到 MongoDB
mongosh --host <hostname> --port <port> -u "testuser" -p "password123" --authenticationDatabase "<database_name>"
刪除用戶
使用?db.dropUser
?命令刪除指定用戶,
示例刪除?testuser
?用戶。
db.dropUser("testuser")
實例操作
完整示例操作流程:
啟動?mongosh
?并連接到服務器。
mongosh --host localhost --port 27017
切換到?testdb
?數據庫。
use testdb
創建?testuser
?用戶,賦予?testdb
?數據庫的?readWrite
?和?read
?角色。
db.createUser({user: "testuser",pwd: "password123",roles: [{ role: "readWrite", db: "testdb" },{ role: "read", db: "testdb" }]
})
重啟 MongoDB 服務并開啟認證
mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
使用Mongodb服務器開啟認證
# 以 testuser 用戶身份連接到 MongoDB,指定認證數據庫為 testdb
mongosh --host localhost --port 27017 -u "testuser" -p "password123" --authenticationDatabase "testdb"# 切換到 testdb 數據庫
test> use testdb;
switched to db testdb# 查看 testdb 數據庫中的集合
testdb> show collections
去除認證后重啟mongodb,登錄刪除testuser用戶
# (需先去除認證并重啟 mongod 后執行)刪除 testuser 用戶
db.dropUser("testuser")