MongoDB 是一種開放源代碼和跨平臺的面向文檔的 NoSQL 數據庫,在構建處理大量數據的快速且可擴展的應用程序方面很受歡迎。與傳統關系型數據庫將數據存儲在表中不同,MongoDB 使用 JSON 格式將數據存儲在文檔中。在 JSON 格式中,數據被格式化為鍵值對,其中字段名稱和值由冒號分隔并封裝在花括號中。
由于其靈活的模式,MongoDB 是需要構建快速、高度可擴展的應用程序以處理大量數據的開發人員的自然選擇。
MongoDB 的最新版本是 v5.0。它于 2021 年 7 月 13 日發布,并附帶新功能和增強功能,其中包括:
- 多云客戶端加密。
- 數據庫的實時重新分片。
- 具有 Windows 函數和聚簇索引的本機時間序列平臺。
- 一個穩定的 API,可以在不影響代碼庫的情況下輕松升級到最新版本。
- Atlas Search 全文搜索解決方案。
還有更多。通過查看MongoDB 5.0 發行說明,您可以在最新版本的 MongoDB 中找到附加功能和修復的完整列表。
在本指南中,我們將重點介紹如何在 Ubuntu 20.04 上安裝 MongoDB 社區版。
第 1 步:安裝 MongoDB
第一步是安裝安裝過程中所需的先決條件包。為此,請運行以下命令。
sudo apt install -y software-properties-common gnupg apt-transport-https ca-certificates
官方 Ubuntu 存儲庫提供了 MongoDB 包,可以使用 APT 包管理器在一個命令中安裝,如下所示:
sudo apt install -y mongodb
但是,存儲庫提供的 MongoDB 版本不是最新版本。在發布本指南時,Ubuntu 存儲庫提供的版本是 v3.6.8。同時,MongoDB提供的最新穩定版本是5.0。
要安裝最新的 MongoDB 包,您需要將 MongoDB 包存儲庫添加到 Ubuntu 上的源列表文件中。
但首先,您需要使用 wget 命令在您的系統上導入 MongoDB 的公鑰,如下所示:
wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -
此命令生成以下輸出,表明已添加公鑰
輸出:
OK
接下來,將 MongoDB 的 APT 存儲庫添加到/etc/apt/sources.list.d目錄中。
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
該命令將mongodb-org-5.0.list文件添加到/etc/apt/sources.list.d/目錄中。該文件包含以下行:
deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse
添加存儲庫后,重新加載本地包索引。
sudo apt update
該命令刷新本地存儲庫并使 Ubuntu 知道新添加的 MongoDB 存儲庫。
一旦完成,安裝mongodb-org提供 MongoDB 的元包。
sudo apt install -y mongodb-org
安裝完成后,您可以驗證安裝的 MongoDB 版本,如下所示:
mongod --version
該命令顯示有關 MongoDB 的一些輸出,包括版本和 Git 版本以及其他詳細信息。
第二步:啟動并啟用MongoDB服務
默認情況下,MongoDB 服務在安裝時處于禁用狀態。您可以通過運行以下命令來驗證這一點:
sudo systemctl status mongod
要啟動 MongoDB 服務,請執行以下命令:
sudo systemctl start mongod
再次確認服務是否正在運行:
sudo systemctl status mongod
從上面的輸出中,您可以看到 MongoDB 已啟動并正在運行。此外,您可以通過啟動與數據庫服務器的連接并運行診斷命令來確認數據庫已啟動并正在運行。
顯示的命令連接到數據庫并顯示 MongoDB 的當前版本、服務器 URL 和它正在偵聽的端口。
mongo --eval 'db.runCommand({ connectionStatus: 1 })'
此外,它還返回 MongoDB 內部connectionStatus命令的值:
“ok”參數的值為 1 表示數據庫服務器正在按預期運行。在第二行中,您可以看到服務器的 URL,即本地主機地址 (127.0.0.1) 和 MongoDB 正在偵聽的默認端口 (27017)。
您還可以檢查默認端口如下
sudo ss -pnltu | grep 27017
驗證服務按預期運行后,您現在可以啟用 MongoDB 以在啟動時啟動,如圖所示。
sudo systemctl enable mongod
至此,MongoDB 已成功安裝并配置為開機啟動。
第 3 步:在 MongoDB 中創建數據庫和用戶
到目前為止,您的 MongoDB 實例應該正在運行并配置為遠程訪問。現在讓我們換個話題,探索如何在 MongoDB 中創建數據庫和用戶。
要訪問 MongoDB,請運行以下命令:
mongosh
在進入 MongoDB shell 之前,您將看到有關 MongoDB 的一些信息,例如 MongoDB 和 MongoDB shell 的版本以及 Mongosh 文檔的 URL。
在 Mongo shell 提示符上方,您還會看到一條警告,指示尚未為數據庫啟用訪問控制,并且對數據和配置的讀寫訪問受到限制。顯示此警告是因為尚未啟用身份驗證。所以不用擔心,一旦啟用對數據庫的身份驗證,此警告就會消失。
默認情況下,安裝時會創建三個數據庫。這些是admin、config和local。`要列出現有數據庫,請運行以下命令:
> show dbs
要創建數據庫,請調用use后跟數據庫名稱的命令。例如,要創建一個名為employees運行命令的數據庫:
> use employees
要確認您當前可以使用的數據庫,請運行db命令。在這種情況下,您將獲得employees輸出
> db
MongoDB 提供了許多用于管理數據庫的 shell 方法。該db.createUser方法允許您在數據庫中創建新用戶。
該方法要求您定義用戶的用戶名和密碼以及您希望授予用戶的任何角色。此信息以 JSON 格式顯示。
下面是如何創建一個在數據庫cherry上具有讀寫角色的用戶的語法。employees
db.createUser( { user: "cherry", pwd: "some_password", roles: [ { role: "readWrite", db: "employees" } ] } )
您可以列出使用db.getUsers()所示方法創建的用戶。
db.getUsers();
或者,您可以運行以下命令:
> show users
輸出:
[ { _id: 'employees.cherry', userId: UUID("lcde5d41-fbba-4c94-806e-6a3c25709f02"), user: 'cherry', db: 'employees', roles: [ { role: 'readWrite', db: 'employees' } ], mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ] } ]
要刪除用戶,請使用db.dropUser如圖所示的方法。
db.dropUser("cherry", {w: "majority", wtimeout: 4000})
輸出:
{ ok: 1 }
第 4 步:保護 MongoDB
在 MongoDB 中,默認情況下不啟用身份驗證,這意味著任何有權訪問數據庫服務器的用戶都可以在沒有任何權限的情況下查看、添加和刪除數據。這是一個嚴重的漏洞,可能會嚴重破壞您的數據。鑒于此,我們將更進一步,演示如何保護 MongoDB。
第一步是創建一個管理用戶,為此,首先訪問 Mongo Shell。
mongosh
接下來,連接或切換到admin數據庫。
> use admin
接下來,通過粘貼這些行并按鍵盤上的 ENTER 鍵來創建數據庫用戶。
db.createUser( { user: "AdminCherry", pwd: passwordPrompt(), roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] } )
讓我們分解這段代碼。
該user: "AdminCherry"行創建了一個名為AdminCherry的管理用戶。
該pwd: passwordPrompt()方法會提示您輸入管理用戶的密碼。pwd:這是比要求您以明文形式鍵入密碼的字段更安全的替代方法。
該roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]行指定授予管理用戶的角色。admin在這里,管理用戶被授予對數據庫的讀寫權限。由于此角色是在admin數據庫中定義的,因此管理用戶實際上可以讀取和修改集群中的所有數據庫。
這是運行命令后的輸出。
要退出 Mongo Shell,請運行exit命令或按CTRL + C。
有了 Admin 用戶,下一步是啟用身份驗證。為此,請打開mongod.conf文件。
sudo nano /etc/mongod.conf
向下滾動并找到該security?部分。取消注釋并添加authorization指令并將其設置為enabled.
security: authorization: enabled
請注意,該authorization參數是縮進security的,但開頭沒有空格。
保存更改并退出配置文件。要應用更改,請如圖所示重新啟動 Mongo 服務。
sudo systemctl restart mongod
此外,請務必檢查服務是否按預期運行。
sudo systemctl status mongod
現在登錄到 Mongo Shell。
mongosh
這一次您會發現警告已經消失。
但是,如果您嘗試執行任何與數據庫相關的任務(例如查看數據庫),您將得到一些表明需要身份驗證的輸出。
> show dbs
exit要使用身份驗證登錄,首先,通過運行命令注銷 Mongo Shell 。然后使用以下語法使用管理用戶登錄。
mongosh "mongodb://adminuser@mongo-ip-address:27017"
提供管理用戶的密碼,這一次,您之前遇到的所有身份驗證警告都將消失。
從現在開始,只有管理用戶才有權限查看、創建和修改數據庫中的數據。
第 5 步:配置 MongoDB 以進行遠程訪問
默認情況下,MongoDB 設置為在安裝它的同一臺服務器上進行本地訪問。要啟用遠程訪問,您需要編輯?/etc/mongod.conf文件,該文件是 MongoDB 的主要配置文件。
它包含數據庫存儲位置、日志記錄、網絡和進程管理等設置。
因此,使用文本編輯器訪問配置文件。
sudo nano /etc/mongod.conf
找到該network interfaces部分并注意bindIP值。
# network interfaces net: port: 27017 bindIp: 127.0.0.1
默認情況下,MongoDB 綁定到 127.0.0.1,這是環回地址接口。這意味著 MongoDB 只能接受來自安裝它的同一服務器的連接。
要允許遠程訪問,請添加一個逗號,然后是 Mongo 服務器的 IP 地址。
bindIp: 127.0.0.1, mongo-server-ip
保存更改并退出配置文件。要應用所做的更改,請重新啟動 MongoDB 服務。
sudo systemctl restart mongod
如果啟用了 UFW,請運行以下命令以允許來自遠程計算機的傳入連接。
sudo ufw allow from remote_machine_ip to any port 27017
要使更改生效,請重新加載防火墻。
sudo ufw reload
第六步:遠程訪問MongoDB
有幾種方法可以遠程訪問 MongoDB shell。您可以使用 netcat 實用程序啟動到端口 27017 的 TCP 連接,這是 MongoDB 偵聽的默認端口。
如果客戶機上沒有安裝 netcat,請按如下方式安裝。
sudo apt install netcat
要通過端口 27017 建立與 MongoDB 服務器的連接,請運行以下命令:
nc -zv mongodb_server_ip 27017
出現以下輸出表示連接成功。
輸出:
Connection to mongodb_server_ip 27017 port [tcp/*] succeeded!
或者,您可以使用 Mongo Shell 登錄,如下所示。
mongosh "mongodb://username@mongo_server_ip:27017"
shell 會自動提示您輸入管理員用戶的密碼。
?專業提示:?使用 Mongo Shell 登錄選項時,請確保客戶端和遠程 MongoDB 服務器上的 Mongo shell 版本相同。
第 7 步:使用 MongoDB 數據庫
您可以在 MongoDB 中執行很多數據庫操作。例如,您可以create、和數據庫retrieve中的記錄。updatedelete
插入數據
要在集合中創建文檔,請使用.insertOne()方法。該方法支持多種數據類型,例如字符串、整數、布爾值和數組。
在上一步中,我們創建了一個名為employees的測試數據庫。我們現在將創建一個集合并添加一些文檔。集合包含一個或多個文檔
下面的命令創建一個名為staff的集合,并添加一個包含一些用戶數據的文檔,如圖所示。
db.staff.insertOne({ name: "Alice", age: 25, city: "London", married: true, hobbies: ["Travelling", "Swimming", "Cooking"] })
命令成功執行后,您將獲得以下輸出。
輸出:
{ acknowledged: true, insertedId: ObjectId("62647ff866c1f054568a11b5") }
檢索數據
staff使用集合中已創建的文檔,您可以檢索它并使用該.find()方法過濾結果。
例如,要檢索staff集合中的所有文檔,請運行以下命令:
db.staff.find()
輸出:
[ { _id: ObjectId("62647ff866c1f054568a11b5"), name: 'Alice', age: 25, city: 'London', married: true, hobbies: [ 'Travelling', 'Swimming', 'Cooking' ] } ]
現在讓我們嘗試一些雄心勃勃的事情。我們將添加更多文檔并對集合運行一些查詢。
db.staff.insertOne({ name: "Bob", age: 29, city: "Liverpool", married: false, hobbies: ["Hiking", "Watching movies", "Driving"] })
db.staff.insertOne({ name: "Winnie", age: 25, city: "Bristol", married: true, hobbies: ["Playing chess", "Surfing", "Painting"] })
查詢已婚員工的記錄,運行以下命令:
db.staff.find({ married: true })
輸出僅提供已婚雇員的記錄。
輸出:
[ { _id: ObjectId("62647ff866c1f054568a11b5"), name: 'Alice', age: 25, city: 'London', married: true, hobbies: [ 'Travelling', 'Swimming', 'Cooking' ] }, { _id: ObjectId("626483d6b490694bc675b767"), name: 'Winnie', age: 25, city: 'Bristol', married: true, hobbies: [ 'Playing chess', 'Surfing', 'Painting' ] } ]
更新數據
要更新或修改記錄,請使用.update()方法。在此示例中,我們演示了如何name將第二條記錄的值從Bob更改為Robert。
db.staff.update({ name: "Bob" }, {$set: { name: "Robert" }})
顯示的輸出確認記錄更新成功。
輸出:
{ acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 }
您現在可以查詢是否可以找到與姓名Robert匹配的記錄,如下所示。
db.staff.find({ name: "Robert" })
輸出:
[ { _id: ObjectId("626483c8b490694bc675b766"), name: 'Robert', age: 29, city: 'Liverpool', married: false, hobbies: [ 'Hiking', 'Watching movies', 'Driving' ] } ]
刪除數據
MongoDB shell 提供了兩種刪除記錄的方法:
.deleteOne() .deleteMany()
該.deleteOne()方法用于從集合中刪除單個記錄或文檔。
該.deleteMany()方法從集合中刪除多個文檔。
刪除單個記錄的最佳方法是使用記錄的_id值。這是賦予每條記錄的唯一值,優于如下所示定義單個條目,后者會導致刪除帶有名稱的每條記錄Robert。
db.staff.deleteOne({ name: "Robert"})
因此,要安全地刪除Robert記錄而不影響具有相同名稱值的其他記錄,請_id改為指定該值。
db.staff.deleteOne({ _id: ObjectId("626483c8b490694bc675b766")})
輸出:
{ acknowledged: true, deletedCount: 1 }
此外,您可以根據特定條件刪除文檔。在這種情況下,使用.deleteMany()刪除多條記錄的方法。
例如,要刪除員工已婚員工集合中的所有文檔,請運行命令:
db.staff.deleteMany({married: true})
輸出:
{ acknowledged: true, deletedCount: 1 }
要刪除集合中的所有文檔,請使用.deleteMany()不帶任何參數的方法:
db.staff.deleteMany({})
如果您嘗試查詢該集合,您會注意到輸出將是空白的,這清楚地表明所有文檔都已被刪除并且該集合現在為空。
結論
MongoDB 是一個功能強大且靈活的 NoSQL 數據庫,其受歡迎程度正在穩步上升。它是構建處理大量非結構化數據的關鍵任務應用程序的首選數據庫。