返回文章列表

MongoDB 資料函式倉管理與維護

本文介紹 MongoDB 資料函式庫的管理與維護技巧,涵蓋 Shell 命令、儲存引擎、鎖定機制、使用者驗證、角色管理以及 JavaScript 應用等導向。文章將引導讀者使用 MongoDB Shell 執行資料函式庫操作,包含建立、更新、刪除資料函式庫、集合和檔案,並探討 WiredTiger

資料函式庫 Web 開發

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({}):在指定的集合中插入一筆檔案。

問題

  1. 什麼是儲存引擎?
  2. 為什麼儲存引擎在資料函式庫中很有用?
  3. MongoDB 中有哪些主要的儲存引擎?
  4. 請解釋 WiredTiger 儲存引擎的一些特點。
  5. 什麼是資料函式庫鎖定?
  6. 為什麼在資料函式庫中使用鎖定?

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")})

內容解密:

  1. db.BPBOnlineBooksDBV4Collection.remove():此指令用於刪除集合 BPBOnlineBooksDBV4Collection 中的檔案。
  2. {"_id" : ObjectId("5e8e94513c9f251e6d749109")}:指定要刪除的檔案的 _id,確保只刪除特定的檔案。

MongoDB 使用者驗證與角色管理

MongoDB 支援根據角色的存取控制(Role-Based Access Control, RBAC),允許管理員根據使用者的角色分配不同的許可權。

建立使用者與角色

  1. 切換到指定的資料函式庫:use BPBOnlineBooksDBWithAuth
  2. 建立具有特定角色的使用者:

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"

內容解密:

  1. --auth:啟用驗證機制,確保只有授權的使用者可以存取資料函式庫。
  2. --port 27017:指定 MongoDB 服務的連線埠。
  3. --dbpath:指定資料函式庫檔案的儲存路徑。

使用驗證連線 MongoDB

可以使用 mongo 命令並加上相關引數進行驗證連線。

mongo -u "manusharma" -p "admin1234" --authenticationDatabase "BPBOnlineBooksDBWithAuth"

或者在進入 MongoDB Shell 後使用 db.auth() 方法進行驗證。

db.auth("manusharma", "admin1234")

內容解密:

  1. -u-p:分別指定使用者名稱和密碼。
  2. --authenticationDatabase:指定進行驗證的資料函式庫名稱。
  3. 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,請按照以下步驟:

  1. 開啟命令視窗並導航到MongoDB的bin目錄。
  2. 輸入命令mongo並按下Enter鍵。
  3. 這將開啟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),則結果會以指定的單位顯示