如何創建 MongoDB 數據庫:要了解的 6 個關鍵方面

已發表: 2022-11-07

根據您對軟件的要求,您可能會優先考慮靈活性、可擴展性、性能或速度。 因此,開發人員和企業在為他們的需求選擇數據庫時經常會感到困惑。 如果您需要一個提供高靈活性和可擴展性的數據庫,以及用於客戶分析的數據聚合,那麼 MongoDB 可能是您的最佳選擇!
在這個有用的指南中了解有關 MongoDB 數據庫的結構以及如何創建、監控和管理數據庫的更多信息點擊鳴叫
在本文中,我們將討論 MongoDB 數據庫的結構以及如何創建、監控和管理您的數據庫! 讓我們開始吧。

MongoDB 數據庫的結構如何?

MongoDB 是一個無模式的 NoSQL 數據庫。 這意味著您不必像為 SQL 數據庫那樣為表/數據庫指定結構。

你知道 NoSQL 數據庫實際上比關係數據庫更快嗎? 這是由於索引、分片和聚合管道等特性。 MongoDB 還以其快速的查詢執行而聞名。 這就是為什麼它受到谷歌、豐田和福布斯等公司的青睞。

下面,我們將探討 MongoDB 的一些關鍵特性。

文件

MongoDB 有一個文檔數據模型,將數據存儲為 JSON 文檔。 文檔自然地映射到應用程序代碼中的對象,使開發人員使用起來更加直接。

在關係數據庫表中,您必須添加一列才能添加新字段。 JSON 文檔中的字段並非如此。 JSON 文檔中的字段可能因文檔而異,因此不會將它們添加到數據庫中的每條記錄中。

文檔可以存儲像數組這樣的結構,這些結構可以嵌套來表達層次關係。 此外,MongoDB 將文檔轉換為二進制 JSON (BSON) 類型。 這確保了更快的訪問並增加了對各種數據類型(如字符串、整數、布爾數等)的支持!

副本集

當您在 MongoDB 中創建新數據庫時,系統會自動創建至少 2 個數據副本。 這些副本被稱為“副本集”,它們不斷地在它們之間複製數據,從而確保提高數據的可用性。 它們還提供系統故障或計劃維護期間的停機保護。

收藏品

集合是與一個數據庫相關聯的一組文檔。 它們類似於關係數據庫中的表。

然而,集合更加靈活。 一方面,它們不依賴於模式。 其次,文檔不必是相同的數據類型!

要查看屬於數據庫的集合列表,請使用命令listCollections

聚合管道

您可以使用此框架來組合多個運算符和表達式。 它很靈活,因為它允許您處理、轉換和分析任何結構的數據。

正因為如此,MongoDB 允許跨 150 個運算符和表達式的快速數據流和特性。 它也有幾個階段,比如聯合階段,它可以靈活地將來自多個集合的結果放在一起。

索引

您可以對 MongoDB 文檔中的任何字段進行索引,以提高其效率並提高查詢速度。 索引通過掃描索引以限制檢查的文檔來節省時間。 這不是比閱讀集合中的每個文檔要好得多嗎?

您可以使用各種索引策略,包括多個字段的複合索引。 例如,假設您有多個文檔,在不同的字段中包含員工的名字和姓氏。 如果您希望返回名字和姓氏,您可以創建一個包含“姓氏”和“名字”的索引。 這比在“姓氏”上有一個索引,在“名字”上有另一個索引要好得多。

您可以利用 Performance Advisor 等工具進一步了解哪些查詢可以從索引中受益。

分片

分片將單個數據集分佈在多個數據庫中。 然後可以將該數據集存儲在多台機器上,以增加系統的總存儲容量。 這是因為它將較大的數據集拆分為較小的塊並將它們存儲在各種數據節點中。

MongoDB 在集合級別對數據進行分片,將集合中的文檔分佈在集群中的各個分片上。 這通過允許架構處理最大的應用程序來確保可擴展性。

如何創建 MongoDB 數據庫

您需要先安裝適合您的操作系統的正確 MongoDB 包。 轉到“下載 MongoDB 社區服務器”頁面。 從可用選項中,選擇最新的“版本”、“打包”格式為 zip 文件,以及“平台”作為您的操作系統,然後單擊“下載”,如下圖所示:

此圖像描述了下載 MongoDB 社區服務器時的可用選項 - 版本、平台和包。
MongoDB社區服務器下載過程。 (圖片來源:MongoDB 社區服務器)

該過程非常簡單,因此您很快就會在系統中安裝 MongoDB!

完成安裝後,打開命令提示符並輸入mongod -version進行驗證。 如果您沒有得到以下輸出,而是看到一串錯誤,則可能需要重新安裝它:

這是安裝後檢查 MongoDB 版本的代碼片段。
驗證 MongoDB 版本。 (圖片來源:configserverfirewall)

使用 MongoDB 外殼

在我們開始之前,請確保:

  • 您的客戶端具有傳輸層安全性,並且在您的 IP 許可名單上。
  • 您在所需的 MongoDB 集群上有一個用戶帳戶和密碼。
  • 你已經在你的設備上安裝了 MongoDB。

第 1 步:訪問 MongoDB Shell

要訪問 MongoDB shell,請輸入以下命令:

 net start MongoDB

這應該給出以下輸出:

這是初始化 MongoDB 服務器的代碼片段
MongoDB 服務器初始化。 (圖片來源:c-sharpcorner)

前面的命令初始化了 MongoDB 服務器。 要運行它,我們必須在命令提示符下輸入mongo

這是運行 MongoDB 服務器的代碼片段。
運行 MongoDB 服務器。 (圖片來源:bmc)

在 MongoDB shell 中,我們可以執行命令來創建數據庫、插入數據、編輯數據、發出管理命令和刪除數據。

第 2 步:創建您的數據庫

與 SQL 不同,MongoDB 沒有數據庫創建命令。 相反,有一個名為use的關鍵字可以切換到指定的數據庫。 如果數據庫不存在,它將創建一個新數據庫,否則,它將鏈接到現有數據庫。

例如,要啟動一個名為“company”的數據庫,請輸入:

 use Company
這是在 MongoDB 中創建數據庫的代碼片段。
在 MongoDB 中創建數據庫。

您可以輸入db以確認您剛剛在系統中創建的數據庫。 如果彈出您創建的新數據庫,則您已成功連接到它。

如果要檢查現有數據庫,請輸入show dbs ,它將返回系統中的所有數據庫:

這是查看系統中現有數據庫的代碼片段。
在 MongoDB 中查看數據庫。

默認情況下,安裝 MongoDB 會創建管理、配置和本地數據庫。

您是否注意到我們創建的數據庫沒有顯示? 這是因為我們還沒有將值保存到數據庫中! 我們將在數據庫管理部分討論插入。

使用 Atlas 用戶界面

您還可以開始使用 MongoDB 的數據庫服務 Atlas。 雖然您可能需要付費才能訪問 Atlas 的某些功能,但大多數數據庫功能都可通過免費層獲得。 免費層的功能足以創建一個 MongoDB 數據庫。

在我們開始之前,請確保:

  1. 您的 IP 在允許列表中。
  2. 您在要使用的 MongoDB 集群上有一個用戶帳戶和密碼。

要使用 AtlasUI 創建 MongoDB 數據庫,請打開瀏覽器窗口並登錄 https://cloud.mongodb.com。 在您的集群頁面中,單擊Browse Collections 。 如果集群中沒有數據庫,您可以通過單擊“添加我自己的數據”按鈕來創建數據庫。

提示將要求您提供數據庫和集合名稱。 為它們命名後,單擊Create ,您就完成了! 您現在可以輸入新文檔或使用驅動程序連接到數據庫。

管理您的 MongoDB 數據庫

在本節中,我們將介紹一些有效管理 MongoDB 數據庫的好方法。 您可以通過使用 MongoDB Compass 或通過集合來完成此操作。

使用集合

雖然關係數據庫擁有定義明確的表和指定的數據類型和列,但 NoSQL 擁有集合而不是表。 這些集合沒有任何結構,並且文檔可能會有所不同——您可以擁有不同的數據類型和字段,而不必匹配同一集合中另一個文檔的格式。

為了演示,讓我們創建一個名為“Employee”的集合併向其中添加一個文檔:

 db.Employee.insert( { "Employeename" : "Chris", "EmployeeDepartment" : "Sales" } )

如果插入成功,則返回WriteResult({ "nInserted" : 1 })

此代碼段返回 WriteResult({
成功插入 MongoDB。

這裡,“db”指的是當前連接的數據庫。 “員工”是公司數據庫中新創建的集合。

我們這裡沒有設置主鍵,因為 MongoDB 會自動創建一個名為“_id”的主鍵字段並為其設置默認值。

運行以下命令以查看 JSON 格式的集合:

 db.Employee.find().forEach(printjson)

輸出:

 { "_id" : ObjectId("63151427a4dd187757d135b8"), "Employeename" : "Chris", "EmployeeDepartment" : "Sales" }

雖然“_id”值是自動分配的,但您可以更改默認主鍵的值。 這一次,我們將在“Employee”數據庫中插入另一個文檔,“_id”值為“1”:

 db.Employee.insert( { "_id" : 1, "EmployeeName" : "Ava", "EmployeeDepartment" : "Public Relations" } )

在運行命令db.Employee.find().forEach(printjson)我們得到以下輸出:

輸出顯示 Employee 集合中的文檔及其主鍵
集合中的文檔及其主鍵。

在上面的輸出中,“Ava”的“_id”值設置為“1”,而不是自動分配一個值。

現在我們已經成功地將值添加到數據庫中,我們可以使用以下命令檢查它是否顯示在我們系統中的現有數據庫下:

 show dbs
輸出顯示了我們系統中現有數據庫中的 Employee 集合。
顯示數據庫列表。

瞧! 您已成功在系統中創建數據庫!

使用 MongoDB 指南針

雖然我們可以在 Mongo shell 中使用 MongoDB 服務器,但有時會很乏味。 您可能會在生產環境中遇到這種情況。

但是,有一個由 MongoDB 創建的指南針工具(適當地命名為 Compass)可以使它變得更容易。 它具有更好的 GUI 和附加功能,例如數據可視化、性能分析以及對數據、數據庫和集合的 CRUD(創建、讀取、更新、刪除)訪問。

您可以為您的操作系統下載 Compass IDE 並通過其簡單的過程進行安裝。

接下來,打開應用程序並通過粘貼連接字符串創建與服務器的連接。 如果找不到,可以單擊分別填寫連接字段。 如果您在安裝 MongoDB 時沒有更改端口號,只需單擊連接按鈕,就可以了! 否則,只需輸入您設置的值並單擊Connect

此圖像顯示“新建連接”窗口,您可以在其中選擇粘貼連接 URL。
MongoDB中的新連接窗口..(圖片來源:mongodb)

接下來,在 New Connection 窗口中提供主機名、端口和身份驗證。

在 MongoDB Compass 中,您可以創建一個數據庫並同時添加其第一個集合。 這是你如何做到的:

  1. 單擊創建數據庫以打開提示。
  2. 輸入數據庫的名稱及其第一個集合。
  3. 單擊創建數據庫

您可以通過單擊數據庫名稱將更多文檔插入數據庫,然後單擊集合名稱以查看“文檔”選項卡。 然後,您可以單擊“添加數據”按鈕將一個或多個文檔插入您的集合中。

添加文檔時,您可以一次輸入一個文檔,也可以將它們作為數組中的多個文檔輸入。 如果要添加多個文檔,請確保將這些逗號分隔的文檔括在方括號中。 例如:

 { _id: 1, item: { name: "apple", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }, { _id: 2, item: { name: "banana", code: "123" }, qty: 20, tags: [ "B" ] }, { _id: 3, item: { name: "spinach", code: "456" }, qty: 25, tags: [ "A", "B" ] }, { _id: 4, item: { name: "lentils", code: "456" }, qty: 30, tags: [ "B", "A" ] }, { _id: 5, item: { name: "pears", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }, { _id: 6, item: { name: "strawberry", code: "123" }, tags: [ "B" ] }

最後,單擊插入將文檔添加到您的集合中。 這是文檔正文的樣子:

 { "StudentID" : 1 "StudentName" : "JohnDoe" }

這裡,字段名稱是“StudentID”和“StudentName”。 字段值分別為“1”和“JohnDoe”。

有用的命令

您可以通過角色管理和用戶管理命令來管理這些集合。

用戶管理命令

MongoDB 用戶管理命令包含與用戶相關的命令。 我們可以使用這些命令創建、更新和刪除用戶。

刪除用戶

此命令從指定數據庫中刪除單個用戶。 下面是語法:

 db.dropUser(username, writeConcern)

在這裡, username是一個必填字段,其中包含有關用戶的身份驗證和訪問信息的文檔。 可選字段writeConcern包含創建操作的寫入關注級別。 寫入關注的級別可以由可選字段writeConcern確定。

在刪除具有userAdminAnyDatabase角色的用戶之前,請確保至少有一個其他用戶具有用戶管理權限。

在此示例中,我們將在測試數據庫中刪除用戶“user26”:

 use test db.dropUser("user26", {w: "majority", wtimeout: 4000})

輸出:

 > db.dropUser("user26", {w: "majority", wtimeout: 4000}); true
創建用戶

此命令為指定的數據庫創建一個新用戶,如下所示:

 db.createUser(user, writeConcern)

在這裡, user是一個必填字段,其中包含有關要創建的用戶的身份驗證和訪問信息的文檔。 可選字段writeConcern包含創建操作的寫入關注級別。 寫入關注的級別可以由可選字段writeConcern確定。

如果用戶已存在於數據庫中, createUser將返回重複用戶錯誤。

您可以在測試數據庫中創建一個新用戶,如下所示:

 use test db.createUser( { user: "user26", pwd: "myuser123", roles: [ "readWrite" ] } );

輸出如下:

 Successfully added user: { "user" : "user26", "roles" : [ "readWrite", "dbAdmin" ] }
grantRolesToUser

您可以利用此命令向用戶授予其他角色。 要使用它,您需要牢記以下語法:

 db.runCommand( { grantRolesToUser: "<user>", roles: [ <roles> ], writeConcern: { <write concern> }, comment: <any> } )

您可以在上述角色中同時指定用戶定義和內置角色。 如果要指定存在於運行grantRolesToUser的同一數據庫中的角色,您可以使用文檔指定角色,如下所述:

 { role: "<role>", db: "<database>" }

或者,您可以簡單地使用角色名稱指定角色。 例如:

 "readWrite"

如果要指定存在於不同數據庫中的角色,則必須使用不同的文檔指定角色。

要授予數據庫角色,您需要對指定數據庫執行grantRole操作。

這是一個示例,可以為您提供清晰的圖片。 例如,產品數據庫中的用戶 productUser00 具有以下角色:

 "roles" : [ { "role" : "assetsWriter", "db" : "assets" } ]

grantRolesToUser操作為“productUser00”提供 stock 數據庫的readWrite角色和 products 數據庫的 read 角色:

 use products db.runCommand({ grantRolesToUser: "productUser00", roles: [ { role: "readWrite", db: "stock"}, "read" ], writeConcern: { w: "majority" , wtimeout: 2000 } })

products 數據庫中的用戶 productUser00 現在擁有以下角色:

 "roles" : [ { "role" : "assetsWriter", "db" : "assets" }, { "role" : "readWrite", "db" : "stock" }, { "role" : "read", "db" : "products" } ]
用戶信息

您可以使用usersInfo命令返回有關一個或多個用戶的信息。 這是語法:

 db.runCommand( { usersInfo: <various>, showCredentials: <Boolean>, showCustomData: <Boolean>, showPrivileges: <Boolean>, showAuthenticationRestrictions: <Boolean>, filter: <document>, comment: <any> } ) { usersInfo: <various> }

在訪問方面,用戶可以隨時查看自己的信息。 要查看其他用戶的信息,運行該命令的用戶必須具有包括對其他用戶數據庫的viewUser操作的權限。

運行userInfo命令時,您可以根據指定的選項獲取以下信息:

 { "users" : [ { "_id" : "<db>.<username>", "userId" : <UUID>, // Starting in MongoDB 4.0.9 "user" : "<username>", "db" : "<db>", "mechanisms" : [ ... ], // Starting in MongoDB 4.0 "customData" : <document>, "roles" : [ ... ], "credentials": { ... }, // only if showCredentials: true "inheritedRoles" : [ ... ], // only if showPrivileges: true or showAuthenticationRestrictions: true "inheritedPrivileges" : [ ... ], // only if showPrivileges: true or showAuthenticationRestrictions: true "inheritedAuthenticationRestrictions" : [ ] // only if showPrivileges: true or showAuthenticationRestrictions: true "authenticationRestrictions" : [ ... ] // only if showAuthenticationRestrictions: true }, ], "ok" : 1 }

現在您已經大致了解了使用usersInfo命令可以完成什麼,接下來可能會出現的明顯問題是,哪些命令可以方便地查看特定用戶和多個用戶?

這裡有兩個方便的例子來說明這一點:
要查看特定用戶的特定權限和信息,而不是憑據,對於“office”數據庫中定義的用戶“Anthony”,請執行以下命令:

 db.runCommand( { usersInfo: { user: "Anthony", db: "office" }, showPrivileges: true } )

如果要查看當前數據庫中的用戶,只能按名稱提及用戶。 例如,如果您在主數據庫中並且主數據庫中存在名為“Timothy”的用戶,則可以運行以下命令:

 db.getSiblingDB("home").runCommand( { usersInfo: "Timothy", showPrivileges: true } )

接下來,如果您希望查看不同用戶的信息,可以使用數組。 您可以包含可選字段showCredentialsshowPrivileges ,也可以選擇將它們排除在外。 這是命令的樣子:

 db.runCommand({ usersInfo: [ { user: "Anthony", db: "office" }, { user: "Timothy", db: "home" } ], showPrivileges: true })
revokeRolesFromUser

您可以利用revokeRolesFromUser命令從存在角色的數據庫上的用戶中刪除一個或多個角色。 revokeRolesFromUser命令具有以下語法:

 db.runCommand( { revokeRolesFromUser: "<user>", roles: [ { role: "<role>", db: "<database>" } | "<role>", ], writeConcern: { <write concern> }, comment: <any> } )

在上述語法中,您可以在roles字段中指定用戶定義和內置角色。 與grantRolesToUser命令類似,您可以在文檔中指定要撤銷的角色或使用其名稱。

要成功執行revokeRolesFromUser命令,您需要對指定數據庫執行revokeRole操作。

這是一個將要點帶回家的示例。 products 數據庫中的productUser00實體具有以下角色:

 "roles" : [ { "role" : "assetsWriter", "db" : "assets" }, { "role" : "readWrite", "db" : "stock" }, { "role" : "read", "db" : "products" } ]

以下revokeRolesFromUser命令將刪除用戶的兩個角色: products中的“讀取”角色和“資產”數據庫中的assetsWriter角色:

 use products db.runCommand( { revokeRolesFromUser: "productUser00", roles: [ { role: "AssetsWriter", db: "assets" }, "read" ], writeConcern: { w: "majority" } } )

產品數據庫中的用戶“productUser00”現在只剩下一個角色:

 "roles" : [ { "role" : "readWrite", "db" : "stock" } ]

角色管理命令

角色授予用戶對資源的訪問權限。 管理員可以使用幾個內置角色來控制對 MongoDB 系統的訪問。 如果角色不涵蓋所需的權限,您甚至可以進一步在特定數據庫中創建新角色。

丟棄角色

使用dropRole命令,您可以從運行該命令的數據庫中刪除用戶定義的角色。 要執行此命令,請使用以下語法:

 db.runCommand( { dropRole: "<role>", writeConcern: { <write concern> }, comment: <any> } )

要成功執行,您必須對指定數據庫執行dropRole操作。 以下操作將從“產品”數據庫中刪除writeTags角色:

use products db.runCommand( { dropRole: "writeTags", writeConcern: { w: "majority" } } )
創建角色

您可以利用createRole命令創建角色並指定其權限。 該角色將應用於您選擇在其上運行命令的數據庫。 如果角色已存在於數據庫中, createRole命令將返回重複角色錯誤。

要執行此命令,請遵循給定的語法:

 db.adminCommand( { createRole: "<new role>", privileges: [ { resource: { <resource> }, actions: [ "<action>", ... ] }, ], roles: [ { role: "<role>", db: "<database>" } | "<role>", ], authenticationRestrictions: [ { clientSource: ["<IP>" | "<CIDR range>", ...], serverAddress: ["<IP>" | "<CIDR range>", ...] }, ], writeConcern: <write concern document>, comment: <any> } )

角色的權限將應用於創建角色的數據庫。 該角色可以從其數據庫中的其他角色繼承權限。 例如,在“admin”數據庫上創建的角色可以包括適用於集群或所有數據庫的權限。 它還可以從其他數據庫中存在的角色繼承特權。

要在數據庫中創建角色,您需要具備兩件事:

  1. 該數據庫上的grantRole操作以提及新角色的權限以及提及要繼承的角色。
  2. 該數據庫資源上的createRole操作。

以下createRole命令將在用戶數據庫上創建clusterAdmin角色:

 db.adminCommand({ createRole: "clusterAdmin", privileges: [ { resource: { cluster: true }, actions: [ "addShard" ] }, { resource: { db: "config", collection: "" }, actions: [ "find", "remove" ] }, { resource: { db: "users", collection: "usersCollection" }, actions: [ "update", "insert" ] }, { resource: { db: "", collection: "" }, actions: [ "find" ] } ], roles: [ { role: "read", db: "user" } ], writeConcern: { w: "majority" , wtimeout: 5000 } })
grantRolesToRole

使用grantRolesToRole命令,您可以將角色授予用戶定義的角色。 grantRolesToRole命令將影響執行該命令的數據庫上的角色。

grantRolesToRole命令具有以下語法:

 db.runCommand( { grantRolesToRole: "<role>", roles: [ { role: "<role>", db: "<database>" }, ], writeConcern: { <write concern> }, comment: <any> } )

訪問權限類似於grantRolesToUser命令——您需要對數據庫執行grantRole操作才能正確執行該命令。

在以下示例中,您可以使用grantRolesToUser命令更新“products”數據庫中的productsReader角色以繼承productsWriter角色的權限:

 use products db.runCommand( { grantRolesToRole: "productsReader", roles: [ "productsWriter" ], writeConcern: { w: "majority" , wtimeout: 5000 } } )
revokePrivilegesFromRole

您可以使用revokePrivilegesFromRole從執行命令的數據庫上的用戶定義角色中刪除指定的權限。 為了正確執行,您需要牢記以下語法:

 db.runCommand( { revokePrivilegesFromRole: "<role>", privileges: [ { resource: { <resource> }, actions: [ "<action>", ... ] }, ], writeConcern: <write concern document>, comment: <any> } )

要撤銷權限,“資源文檔”模式必須匹配該權限的“資源”字段。 “actions”字段可以是完全匹配的,也可以是子集。

例如,考慮 products 數據庫中的角色manageRole具有以下權限,將“managers”數據庫指定為資源:

 { "resource" : { "db" : "managers", "collection" : "" }, "actions" : [ "insert", "remove" ] }

您不能僅從管理器數據庫中的一個集合中撤消“插入”或“刪除”操作。 以下操作不會導致角色發生變化:

 use managers db.runCommand( { revokePrivilegesFromRole: "manageRole", privileges: [ { resource : { db : "managers", collection : "kiosks" }, actions : [ "insert", "remove" ] } ] } )
 db.runCommand( { revokePrivilegesFromRole: "manageRole", privileges: [ { resource : { db : "managers", collection : "kiosks" }, actions : [ "insert" ] } ] } )

要從角色manageRole撤消“插入”和/或“刪除”操作,您需要完全匹配資源文檔。 例如,以下操作僅撤銷現有權限的“刪除”操作:

 use managers db.runCommand( { revokePrivilegesFromRole: "manageRole", privileges: [ { resource : { db : "managers", collection : "" }, actions : [ "remove" ] } ] } )

以下操作將從管理器數據庫中的“執行”角色中刪除多個權限:

 use managers db.runCommand( { revokePrivilegesFromRole: "executive", privileges: [ { resource: { db: "managers", collection: "" }, actions: [ "insert", "remove", "find" ] }, { resource: { db: "managers", collection: "partners" }, actions: [ "update" ] } ], writeConcern: { w: "majority" } } )
角色信息

rolesInfo命令將返回指定角色的特權和繼承信息,包括內置角色和用戶定義角色。 您還可以利用rolesInfo命令檢索範圍為數據庫的所有角色。

為了正確執行,請遵循以下語法:

 db.runCommand( { rolesInfo: { role: <name>, db: <db> }, showPrivileges: <Boolean>, showBuiltinRoles: <Boolean>, comment: <any> } )

要從當前數據庫返回角色的信息,您可以指定其名稱,如下所示:

 { rolesInfo: "<rolename>" }

要從另一個數據庫返回某個角色的信息,您可以使用提及該角色和該數據庫的文檔來提及該角色:

 { rolesInfo: { role: "<rolename>", db: "<database>" } }

例如,以下命令返回在管理器數據庫中定義的角色執行者的角色繼承信息:

 db.runCommand( { rolesInfo: { role: "executive", db: "managers" } } )

下一條命令將返回角色繼承信息:執行命令的數據庫上的accountManager

 db.runCommand( { rolesInfo: "accountManager" } )

以下命令將返回在管理器數據庫中定義的角色“執行”的權限和角色繼承:

 db.runCommand( { rolesInfo: { role: "executive", db: "managers" }, showPrivileges: true } )

要提及多個角色,您可以使用數組。 您還可以將數組中的每個角色作為字符串或文檔提及。

僅當角色存在於執行命令的數據庫中時,才應使用字符串:

 { rolesInfo: [ "<rolename>", { role: "<rolename>", db: "<database>" }, ] }

例如,以下命令將返回三個不同數據庫中三個角色的信息:

 db.runCommand( { rolesInfo: [ { role: "executive", db: "managers" }, { role: "accounts", db: "departments" }, { role: "administrator", db: "products" } ] } )

您可以獲得特權和角色繼承,如下所示:

 db.runCommand( { rolesInfo: [ { role: "executive", db: "managers" }, { role: "accounts", db: "departments" }, { role: "administrator", db: "products" } ], showPrivileges: true } )

嵌入 MongoDB 文檔以獲得更好的性能

MongoDB 等文檔數據庫可讓您根據需要定義架構。 要在 MongoDB 中創建最佳模式,您可以嵌套文檔。 因此,您可以構建一個與您的用例匹配的數據模型,而不是將您的應用程序與數據模型匹配。

因停機時間和 WordPress 問題而苦苦掙扎? Kinsta 是旨在節省您時間的託管解決方案! 查看我們的功能

嵌入式文檔讓您可以存儲一起訪問的相關數據。 在為 MongoDB 設計模式時,建議您默認嵌入文檔。 僅在值得時才使用數據庫端或應用程序端的連接和引用。

確保工作負載可以根據需要經常檢索文檔。 同時,文檔還應該包含它需要的所有數據。 這對於您的應用程序的卓越性能至關重要。

下面,您會發現一些嵌入文檔的不同模式:

嵌入式文檔模式

您可以使用它在使用它們的文檔中嵌入甚至複雜的子結構。 在單個文檔中嵌入連接的數據可以減少獲取數據所需的讀取操作次數。 通常,您應該構建您的架構,以便您的應用程序在單個讀取操作中接收其所有必需的信息。 因此,這裡要記住的規則是一起使用的內容應該一起存儲

嵌入式子集模式

嵌入式子集模式是一種混合情況。 您可以將它用於一長串相關項目的單獨集合,您可以將其中一些項目放在手邊以供展示。

這是一個列出電影評論的示例:

 > db.movie.findOne() { _id: 321475, title: "The Dark Knight" } > db.review.find({movie_id: 321475}) { _id: 264579, movie_id: 321475, stars: 4 text: "Amazing" } { _id: 375684, movie_id: 321475, stars:5, text: "Mindblowing" }

現在,想像一千條類似的評論,但您只打算在放映電影時顯示最近的兩條。 在這種情況下,將該子集存儲為電影文檔中的列表是有意義的:

 > db.movie.findOne({_id: 321475}) { _id: 321475, title: "The Dark Knight", recent_reviews: [ {_id: 264579, stars: 4, text: "Amazing"}, {_id: 375684, stars: 5, text: "Mindblowing"} ] }</code

簡而言之,如果您經常訪問相關項目的子集,請確保將其嵌入。

獨立訪問

您可能希望將子文檔存儲在它們的集合中,以將它們與父集合分開。

例如,以一家公司的產品線為例。 如果公司銷售一小部分產品,您可能希望將它們存儲在公司文檔中。 但是,如果您想跨公司重複使用它們或通過他們的庫存單位 (SKU) 直接訪問它們,您還希望將它們存儲在他們的集合中。

如果您獨立操作或訪問實體,請創建一個集合以單獨存儲它以實現最佳實踐。

無限列表

在他們的文檔中存儲相關信息的簡短列表有一個缺點。 如果您的列表繼續不受檢查地增長,則不應將其放在單個文檔中。 這是因為您將無法長時間支持它。

有兩個原因。 首先,MongoDB 對單個文檔的大小有限制。 其次,如果您以太多頻率訪問文檔,您會看到不受控制的內存使用造成的負面結果。

簡單來說,如果一個列表開始無限增長,就做一個集合單獨存儲。

擴展參考模式

擴展參考模式類似於子集模式。 它還優化了您定期訪問以存儲在文檔中的信息。

在這裡,當一個文檔引用同一集合中存在的另一個文檔時,它被利用而不是列表。 同時,它還存儲其他文檔中的一些字段以供隨時訪問。

例如:

 > db.movie.findOne({_id: 245434}) { _id: 245434, title: "Mission Impossible 4 - Ghost Protocol", studio_id: 924935, studio_name: "Paramount Pictures" }

As you can see, “the studio_id” is stored so that you can look up more information on the studio that created the film. But the studio's name is also copied to this document for simplicity.

To embed information from modified documents regularly, remember to update documents where you've copied that information when it is modified. In other words, if you routinely access some fields from a referenced document, embed them.

How To Monitor MongoDB

You can use monitoring tools like Kinsta APM to debug long API calls, slow database queries, long external URL requests, to name a few. You can even leverage commands to improve database performance. You can also use them to inspect the ase/” data-mce-href=”https://kinsta.com/knowledgebase/wordpress-repair-database/”>health of your database instances.

Why Should You Monitor MongoDB Databases?

A key aspect of database administration planning is monitoring your cluster's performance and health. MongoDB Atlas handles the majority of administration efforts through its fault-tolerance/scaling abilities.

Despite that, users need to know how to track clusters. They should also know how to scale or tweak whatever they need before hitting a crisis.

By monitoring MongoDB databases, you can:

  • Observe the utilization of resources.
  • Understand the current capacity of your database.
  • React and detect real-time issues to enhance your application stack.
  • Observe the presence of performance issues and abnormal behavior.
  • Align with your governance/data protection and service-level agreement (SLA) requirements.

Key Metrics To Monitor

While monitoring MongoDB, there are four key aspects you need to keep in mind:

1. MongoDB Hardware Metrics

Here are the primary metrics for monitoring hardware:

Normalized Process CPU

It's defined as the percentage of time spent by the CPU on application software maintaining the MongoDB process.

You can scale this to a range of 0-100% by dividing it by the number of CPU cores. It includes CPU leveraged by modules such as kernel and user.

High kernel CPU might show exhaustion of CPU via the operating system operations. But the user linked with MongoDB operations might be the root cause of CPU exhaustion.

Normalized System CPU

It's the percentage of time the CPU spent on system calls servicing this MongoDB process. You can scale it to a range of 0-100% by dividing it by the number of CPU cores. It also covers the CPU used by modules such as iowait, user, kernel, steal, etc.

User CPU or high kernel might show CPU exhaustion through MongoDB operations (software). High iowait might be linked to storage exhaustion causing CPU exhaustion.

Disk IOPS

Disk IOPS is the average consumed IO operations per second on MongoDB's disk partition.

磁盤延遲

This is the disk partition's read and write disk latency in milliseconds in MongoDB. High values (>500ms) show that the storage layer might affect MongoDB's performance.

系統內存

Use the system memory to describe physical memory bytes used versus available free space.

The available metric approximates the number of bytes of system memory available. You can use this to execute new applications, without swapping.

Disk Space Free

This is defined as the total bytes of free disk space on MongoDB's disk partition. MongoDB Atlas provides auto-scaling capabilities based on this metric.

Swap Usage

You can leverage a swap usage graph to describe how much memory is being placed on the swap device. A high used metric in this graph shows that swap is being utilized. This shows that the memory is under-provisioned for the current workload.

MongoDB Cluster's Connection and Operation Metrics

Here are the main metrics for Operation and Connection Metrics:

Operation Execution Times

The average operation time (write and read operations) performed over the selected sample period.

Opcounters

It is the average rate of operations executed per second over the selected sample period. Opcounters graph/metric shows the operations breakdown of operation types and velocity for the instance.

連接

This metric refers to the number of open connections to the instance. High spikes or numbers might point to a suboptimal connection strategy either from the unresponsive server or the client side.

Query Targeting and Query Executors

This is the average rate per second over the selected sample period of scanned documents. For query executors, this is during query-plan evaluation and queries. Query targeting shows the ratio between the number of documents scanned and the number of documents returned.

高數量比率表明操作不理想。 這些操作掃描大量文檔以返回較小的部分。

掃碼下單

它描述了所選查詢樣本期間每秒的平均速率。 它返回無法使用索引執行排序操作的排序結果。

隊列

隊列可以描述等待鎖的操作數,寫或讀。 高隊列可能描述了不是最優模式設計的存在。 它還可能表明存在衝突的寫入路徑,從而推動數據庫資源的激烈競爭。

MongoDB 複製指標

以下是複制監控的主要指標:

複製 Oplog 窗口

該指標列出了主節點的複制 oplog 中可用的大緻小時數。 如果次要滯後超過此數量,則它無法跟上並需要完全重新同步。

複製滯後

複製延遲定義為輔助節點在寫入操作中落後於主節點的近似秒數。 高複制延遲將指向在復制方面面臨困難的輔助節點。 考慮到連接的讀/寫問題,它可能會影響您的操作延遲。

複製空間

該指標是指主複製的 oplog 窗口和輔助複製延遲之間的差異。 如果此值變為零,則可能會導致輔助設備進入恢復模式。

操作計數器-repl

Opcounters -repl 定義為所選採樣週期內每秒執行的複制操作的平均速率。 使用 opcounters -graph/metric,您可以查看指定實例的操作速度和操作類型的細分。

Oplog GB/小時

這被定義為主節點每小時生成的 oplog 的平均速率。 大量意外的 oplog 可能表明寫入工作負載嚴重不足或存在模式設計問題。

MongoDB 性能監控工具

MongoDB 在 Cloud Manager、Atlas 和 Ops Manager 中內置了用於性能跟踪的用戶界面工具。 它還提供了一些獨立的命令和工具來查看更多基於原始的數據。 我們將討論一些您可以從具有訪問權限和適當角色的主機運行的工具,以檢查您的環境:

蒙戈托普

您可以利用此命令來跟踪 MongoDB 實例在每個集合中寫入和讀取數據所花費的時間。 使用以下語法:

 mongotop <options> <connection-string> <polling-interval in seconds>

rs.status()

該命令返回副本集狀態。 它是從執行方法的成員的角度執行的。

mongostat

您可以使用mongostat命令快速了解 MongoDB 服務器實例的狀態。 為了獲得最佳輸出,您可以使用它來查看特定事件的單個實例,因為它提供了實時視圖。

利用此命令監控基本服務器統計信息,例如鎖定隊列、操作故障、MongoDB 內存統計信息和連接/網絡:

 mongostat <options> <connection-string> <polling interval in seconds>

數據庫統計

此命令返回特定數據庫的存儲統計信息,例如索引數量及其大小、集合數據總量與存儲大小的關係,以及與集合相關的統計信息(集合和文檔的數量)。

db.serverStatus()

您可以利用db.serverStatus()命令來概覽數據庫的狀態。 它為您提供了代表當前實例度量計數器的文檔。 定期執行此命令以整理有關實例的統計信息。

collStats

collStats命令收集類似於dbStats在收集級別提供的統計信息。 它的輸出包括集合中的對象計數、集合消耗的磁盤空間量、集合的大小以及有關給定集合的索引的信息。

您可以使用所有這些命令來提供數據庫服務器的實時報告和監控,從而讓您監控數據庫性能和錯誤,並協助做出明智的決策以優化數據庫。

如何刪除 MongoDB 數據庫

要刪除您在 MongoDB 中創建的數據庫,您需要通過 use 關鍵字連接到它。

假設您創建了一個名為“Engineers”的數據庫。 要連接到數據庫,您將使用以下命令:

 use Engineers

接下來,鍵入db.dropDatabase()以擺脫此數據庫。 執行後,這是您可以預期的結果:

 { "dropped" : "Engineers", "ok" : 1 }

您可以運行showdbs命令來驗證數據庫是否仍然存在。

概括

要從 MongoDB 中榨取每一滴價值,您必須對基礎知識有深刻的理解。 因此,了解 MongoDB 數據庫至關重要。 這需要先熟悉創建數據庫的方法。
正在尋找提供高靈活性和可擴展性的數據庫? MongoDB 可能是答案... 點擊鳴叫
在本文中,我們闡明了可用於在 MongoDB 中創建數據庫的不同方法,然後詳細描述了一些漂亮的 MongoDB 命令,以使您始終掌握數據庫。 最後,我們通過討論如何利用 MongoDB 中的嵌入式文檔和性能監控工具來確保您的工作流以最高效率運行,從而結束了討論。

您對這些 MongoDB 命令有何看法? 我們是否錯過了您希望在這裡看到的某個方面或方法? 讓我們在評論中知道!