MongoDB 提供了強大的 Shell 工具和豐富的 API,方便開發者進行資料函式倉管理和維護。透過 Shell 命令,可以有效地管理資料函式庫、集合和檔案,例如使用 db.createCollection() 建立集合、使用 db.collection.insert() 插入檔案,以及使用 db.collection.find() 查詢資料。WiredTiger 作為 MongoDB 的預設儲存引擎,具備檔案級別的平行控制、高效的資料壓縮和加密等特性,有效提升了資料函式庫的效能和安全性。瞭解 MongoDB 的鎖定機制,例如全域鎖定、資料函式庫鎖定和集合鎖定,對於確保資料一致性和完整性至關重要。
管理與維護 MongoDB
本章節將介紹用於管理與維護 MongoDB 的基本命令和方法。我們將透過 MongoDB Shell 來學習這些命令和方法,瞭解如何建立、更新和刪除資料函式庫、集合和檔案。
MongoDB 管理命令和方法
在開始之前,我們需要了解一些常用的管理命令和方法。這些命令和方法用於建立資料函式庫和集合,以及進行其他相關操作。
資料函式庫儲存引擎
MongoDB 支援多種儲存引擎,包括 WiredTiger、In-Memory 和 Encrypted。其中,WiredTiger 是預設的儲存引擎,提供高效的資料壓縮和加密功能。
WiredTiger 儲存引擎
WiredTiger 是一種高效的儲存引擎,提供以下特點:
- 檔案級的平行控制
- 高效的資料壓縮
- 支援加密
// 使用 WiredTiger 儲存引擎建立資料函式庫
db = db.getSiblingDB('mydatabase');
db.createCollection('mycollection', { storageEngine: { wiredTiger: {} } });
內容解密:
db.getSiblingDB('mydatabase'):取得指定名稱的資料函式庫物件。db.createCollection('mycollection', { storageEngine: { wiredTiger: {} } }):在指定資料函式庫中建立一個新的集合,並指定使用 WiredTiger 儲存引擎。
資料函式庫鎖定機制
MongoDB 使用鎖定機制來確保資料的一致性和完整性。鎖定機制可以防止多個使用者同時修改相同的資料。
鎖定型別
MongoDB 支援多種鎖定型別,包括:
- 讀取鎖定(Read Lock)
- 寫入鎖定(Write Lock)
- 解鎖(Unlock)
MongoDB 中的鎖定機制
MongoDB 使用多粒度鎖定機制,可以在不同的層級進行鎖定,包括:
- 全域鎖定(Global Lock)
- 資料函式庫鎖定(Database Lock)
- 集合鎖定(Collection Lock)
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title MongoDB 資料函式倉管理與維護
package "資料庫架構" {
package "應用層" {
component [連線池] as pool
component [ORM 框架] as orm
}
package "資料庫引擎" {
component [查詢解析器] as parser
component [優化器] as optimizer
component [執行引擎] as executor
}
package "儲存層" {
database [主資料庫] as master
database [讀取副本] as replica
database [快取層] as cache
}
}
pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中
master --> replica : 資料同步
note right of cache
Redis/Memcached
減少資料庫負載
end note
@enduml
此圖示說明瞭 MongoDB 中的鎖定層級結構。
MongoDB 管理命令
以下是一些常用的 MongoDB 管理命令:
show dbs:顯示所有資料函式庫。use <database>:切換到指定的資料函式庫。db.createCollection('<collection>'):在目前資料函式庫中建立一個新的集合。db.<collection>.insertOne({}):在指定的集合中插入一筆檔案。
// 顯示所有資料函式庫
db.adminCommand('listDatabases');
// 切換到指定的資料函式庫
db = db.getSiblingDB('mydatabase');
// 在目前資料函式庫中建立一個新的集合
db.createCollection('mycollection');
// 在指定的集合中插入一筆檔案
db.mycollection.insertOne({ name: 'John Doe', age: 30 });
內容解密:
db.adminCommand('listDatabases'):取得所有資料函式庫的列表。db.getSiblingDB('mydatabase'):取得指定名稱的資料函式庫物件。db.createCollection('mycollection'):在目前資料函式庫中建立一個新的集合。db.mycollection.insertOne({}):在指定的集合中插入一筆檔案。
問題
- 什麼是儲存引擎?
- 為什麼儲存引擎在資料函式庫中很有用?
- MongoDB 中有哪些主要的儲存引擎?
- 請解釋 WiredTiger 儲存引擎的一些特點。
- 什麼是資料函式庫鎖定?
- 為什麼在資料函式庫中使用鎖定?
MongoDB 管理命令與方法詳解
MongoDB 提供了多種 Shell 命令和方法,用於執行資料函式倉管理、集合操作和檔案 CRUD(建立、讀取、更新、刪除)操作。以下將詳細介紹這些命令和方法的使用方式和實際範例。
建立資料函式庫命令
在 MongoDB 中,建立資料函式庫的命令非常簡單,使用 use <database-name> 即可建立一個新的資料函式庫。如果指定的資料函式庫不存在,MongoDB 會在首次插入資料時自動建立它。
use BPBOnlineBooksDB
內容解密:
use BPBOnlineBooksDB:切換到名為BPBOnlineBooksDB的資料函式庫。如果該資料函式庫不存在,則會在插入資料時自動建立。- MongoDB 不會立即建立資料函式庫,直到有集合和檔案被插入。
建立集合命令
MongoDB 提供了兩種方式來建立集合:使用 db.createCollection() 方法或透過插入檔案自動建立。
使用 db.createCollection() 方法
db.createCollection("BPBOnlineBooksDBCollection-V2")
內容解密:
db.createCollection("BPBOnlineBooksDBCollection-V2"):在當前資料函式庫中建立一個名為BPBOnlineBooksDBCollection-V2的集合。- 此方法允許指定集合的選項,如大小限制和索引。
自動建立集合
db.BPBOnlineBooksDBCollection-V3.insert({"book-title":"Mastering MongoDB with JavaScript"})
內容解密:
db.BPBOnlineBooksDBCollection-V3.insert():向BPBOnlineBooksDBCollection-V3集合插入一個檔案。如果該集合不存在,MongoDB 會自動建立它。- 這是一種便捷的方式,可以在插入資料的同時建立集合。
刪除資料函式庫命令
要刪除一個資料函式庫,首先需要切換到該資料函式庫,然後使用 db.dropDatabase() 方法。
use BPBOnlineBooksDBV2
db.dropDatabase()
內容解密:
use BPBOnlineBooksDBV2:切換到要刪除的資料函式庫。db.dropDatabase():刪除當前所在的資料函式庫及其所有集合和檔案。
刪除集合命令
要刪除一個集合,可以使用 db.<collection-name>.drop() 方法。
db.BPBOnlineBooksDBV3Collection.drop()
內容解密:
db.BPBOnlineBooksDBV3Collection.drop():刪除名為BPBOnlineBooksDBV3Collection的集合及其所有檔案。- 該操作不可逆,刪除後資料將無法還原。
插入檔案命令
使用 db.<collection-name>.insert() 方法可以在指定的集合中插入檔案。
db.BPBOnlineBooksDBV4Collection.insert({
"book-isbn-number": "1234567890",
"book-title": "The introduction to Qbasic",
"book-price": "INR 500"
})
內容解密:
db.BPBOnlineBooksDBV4Collection.insert():在BPBOnlineBooksDBV4Collection集合中插入一個包含書籍 ISBN 號、標題和價格的檔案。- 如果集合不存在,該操作會自動建立它。
讀取檔案命令
使用 db.<collection-name>.find() 方法可以讀取集合中的檔案。
db.BPBOnlineBooksDBV4Collection.find()
內容解密:
db.BPBOnlineBooksDBV4Collection.find():檢索BPBOnlineBooksDBV4Collection集合中的所有檔案。- 該方法傳回集合中的所有檔案,可以用於檢視集合中的資料。
MongoDB 管理與驗證指令詳解
MongoDB 提供了多種指令與方法來進行資料函式庫的管理與操作,本章節將探討 MongoDB Shell 的基本指令與驗證機制。
讀取檔案指令
在 MongoDB 中,讀取檔案是一項基本操作。可以使用 db.<collection-name>.find() 指令來讀取集合中的檔案。若要以較易讀的方式呈現結果,可以在 find() 後面加上 pretty() 方法。
db.BPBOnlineBooksDBV4Collection.find().pretty()
刪除檔案指令
若要刪除集合中的特設定檔案,可以使用 remove() 方法,並指定要刪除的檔案的 _id。
db.BPBOnlineBooksDBV4Collection.remove({"_id" : ObjectId("5e8e94513c9f251e6d749109")})
內容解密:
db.BPBOnlineBooksDBV4Collection.remove():此指令用於刪除集合BPBOnlineBooksDBV4Collection中的檔案。{"_id" : ObjectId("5e8e94513c9f251e6d749109")}:指定要刪除的檔案的_id,確保只刪除特定的檔案。
MongoDB 使用者驗證與角色管理
MongoDB 支援根據角色的存取控制(Role-Based Access Control, RBAC),允許管理員根據使用者的角色分配不同的許可權。
建立使用者與角色
- 切換到指定的資料函式庫:
use BPBOnlineBooksDBWithAuth - 建立具有特定角色的使用者:
db.createUser( { user: “manusharma”, pwd: “admin1234”, roles: [ { role: “userAdmin”, db: “BPBOnlineBooksDBWithAuth” } ] } )
#### 內容解密:
1. `db.createUser()`:此方法用於建立新的使用者。
2. `user` 和 `pwd`:分別指定使用者的名稱和密碼。
3. `roles`:定義使用者的角色,此處指定為 `userAdmin` 角色,並繫結到 `BPBOnlineBooksDBWithAuth` 資料函式庫。
### 啟動 MongoDB 驗證
要啟用 MongoDB 的驗證機制,需要在啟動 `mongod` 服務時加上 `--auth` 引數。
```bash
mongod --auth --port 27017 --dbpath "c:\Program Files\MongoDB\Server\4.2\data\db"
內容解密:
--auth:啟用驗證機制,確保只有授權的使用者可以存取資料函式庫。--port 27017:指定 MongoDB 服務的連線埠。--dbpath:指定資料函式庫檔案的儲存路徑。
使用驗證連線 MongoDB
可以使用 mongo 命令並加上相關引數進行驗證連線。
mongo -u "manusharma" -p "admin1234" --authenticationDatabase "BPBOnlineBooksDBWithAuth"
或者在進入 MongoDB Shell 後使用 db.auth() 方法進行驗證。
db.auth("manusharma", "admin1234")
內容解密:
-u和-p:分別指定使用者名稱和密碼。--authenticationDatabase:指定進行驗證的資料函式庫名稱。db.auth():在 MongoDB Shell 中進行驗證的方法,回傳1表示驗證成功。
MongoDB中的JavaScript應用
在前面的章節中,我們已經瞭解到MongoDB Shell是一個根據JavaScript的介面,允許我們執行各種命令。除了MongoDB特定的操作外,MongoDB Shell還能夠解析JavaScript命令。
MongoDB中的伺服器端JavaScript
MongoDB有多種方法和運算子使用伺服器端JavaScript的執行。我們將在後面的章節中詳細介紹這些內容。目前,我們將簡要介紹兩個主要的主題:MapReduce和$where。
MapReduce是什麼?
MapReduce是MongoDB中的一個過程或方法,用於處理、過濾大量資料,然後將其簡化為一組小型資料叢集。這是一種將資料分組並形成包含某些資訊的集合的方法。因此,MapReduce方法通常用於處理大型資料集。
$where運算子是什麼?
$where是JavaScript中的一個運算子,用於匹配MongoDB中符合特定條件的檔案。通常,我們將JavaScript表示式或函式傳遞給$where運算子。我們將在後面的高階章節中更詳細地介紹這些主題。
MongoDB官方支援的語言列表
在第1章:MongoDB簡介中,我們瞭解到MongoDB驅動程式依賴於程式語言,並幫助應用程式執行各種CRUD和其他與MongoDB資料函式庫相關的操作。因此,除了JavaScript之外,MongoDB還支援許多其他語言。
以下是MongoDB官方支援的語言列表:
- C
- C++
- C#
- Go
- Java
- Node.js
- Perl
- PHP
- Python
- Ruby
- Scala
- Swift
除了這些語言之外,MongoDB社群還支援許多其他語言,並由MongoDB社群建立了相關的驅動程式。
MongoDB方法
在本章中,我們將介紹各種MongoDB方法。首先,讓我們開啟一個MongoDB Shell。
連線到MongoDB Shell
要從Windows機器連線到MongoDB,請按照以下步驟:
- 開啟命令視窗並導航到MongoDB的bin目錄。
- 輸入命令
mongo並按下Enter鍵。 - 這將開啟Mongo Shell,我們可以輸入與Mongo相關的命令。
現在,我們已經進入了MongoDB Shell。我們可以使用各種MongoDB方法。
MongoDB連線方法
我們將介紹一些最常見和最重要的與連線相關的方法。
connect(url, username, password)
此方法建立與MongoDB例項的連線。它傳回對MongoDB資料函式庫的參照。它最多接受3個引數。第一個引數是必填的,它接受包含主機名、埠和資料函式庫的URL。最後兩個引數(使用者名稱和密碼)是可選的。
db = connect("localhost:27017/bpbOnlineBooks");
Mongo(host, clientSideOptions)
此方法從MongoDB Shell或JavaScript檔案啟動與MongoDB資料函式庫的連線。它最多接受2個引數。第一個引數是可選的,它接受主機名或主機名與埠。如果省略這些值,它將啟動與本地主機的連線,預設埠號為27017。
MongoDBConnection = Mongo("mongodb://localhost:27017/");
Mongo.getDB(database)
此方法提供對MongoDB資料函式庫物件的存取。它只接受1個引數,該引數是必填的,它接受我們想要存取的資料函式庫名稱。
db = MongoDBConnection.getDB("BPBOnlineBooksDB");
MongoDB資料函式庫方法
我們將介紹一些最常見和最重要的與MongoDB資料函式庫相關的方法。
db.getMongo()
此方法用於測試MongoDB Shell是否具有與資料函式庫例項的正確連線。它傳回資料函式庫連線。
#### 內容解密:
db.getMongo() 方法傳回目前 MongoDB Shell 與資料函式庫例項之間的連線物件。這可用於驗證連線的有效性。
db.hostInfo()
此方法傳回有關主機的資訊,即傳回有關執行MongoDB的系統的資訊。
#### 內容解密:
db.hostInfo() 方法提供了執行 MongoDB 的主機系統資訊,包括作業系統、硬體架構等詳細資訊。
db.stats()
此方法傳回單個資料函式庫的統計資訊。它只接受1個引數,該引數是可選的,它接受一個縮放數字,以決定輸出的單位(例如,以千位元組為單位)。
#### 內容解密:
db.stats() 方法傳回指定資料函式庫的統計資訊,包括資料大小、集合數量等。若傳遞引數(如 1024),則結果會以指定的單位顯示。