分享到

導言

連線到資料庫伺服器通常是你在設計和配置資料庫支援的應用程式時需要完成的首要任務之一。雖然有許多方法可以嚮應用程式提供地址、監聽埠、憑據和其他詳細資訊,但連線 URI(有時稱為連線字串或連線 URL)是一種以緊湊格式指定複雜配置的最強大和最靈活的方式之一。

在本指南中,我們將討論如何使用你的 MongoDB 資料庫資訊和認證詳細資訊來格式化連線 URI。連線 URI 分為多個部分,我們將逐步介紹每個部分。

百分比編碼值

在我們開始之前,我們應該提到 MongoDB 連線 URI 期望使用百分比編碼值。這意味著 URL 中任何具有特殊含義的字元都必須轉換為其百分比編碼的對應字元,以確保庫和應用程式能夠正確解釋它們。

應進行百分比編碼的字元包括

  • :%3A
  • /%2F
  • ?%3F
  • #: %23
  • [%5B
  • ]%5D
  • @: %40

這些在連線 URI 中具有特殊含義。

因此,如果你的密碼是...

pe@ce&lo\/3

...你需要在連線 URI 中將其指定為

pe%40ce&lo\%2F3

如果你不確定某個字元是否應進行百分比編碼,通常最好還是將其編碼。例如,如果你不確定字元 \ 是否為保留字元,為了安全起見,可以使用其百分比編碼等效項 %5C

pe%40ce%26lo%5C%2F3

在構建連線 URI 時,請牢記這一點。

快速概覽

在我們深入細節之前,我們可以先了解一下 MongoDB 連線 URI 的規範

mongodb://[username:password@]host[:port][,...hostN[:port]][/[database][?parameter_list]]
\________/\__________________/\___________________________/\__________/\________________/
| | | | |
|- schema |- auth credentials | | |- parameter list
| |
| |- default authentication database
|
|- host specifier

方括號中的部分表示可選部分。你可能已經注意到 URI 的大部分部分都是可選的。可能也很明顯,你可以在 URI 中編碼許多資訊。

各個元件的快速描述

  • mongodb://:用於將字串標識為 MongoDB 連線 URI 的 Schema 識別符號。
  • auth credentials:URI 的一個可選元件,可用於指定連線時使用的使用者和密碼。
    • username:可選的使用者名稱。如果包含,它應在第二個斜槓 (/) 之後開始,並持續到冒號 (:)。如果包含,則必須附帶 password
    • password:可選的密碼。如果包含,它在冒號 (:) 之後開始,並持續到 at 符號 (@)。如果包含,則必須附帶 username
  • host specifier:一個必需元件,用於指定一個或多個要連線的主機名和埠。
    • host:要連線的伺服器的 IP 地址、DNS 名稱或本地可解析名稱。主機名持續到冒號 (:)(如果包含埠)、逗號 (,)(如果指定了多個主機),或者斜槓 (/)。必須至少提供一個主機。
    • port:可選的埠規範,用於指示 MongoDB 在主機上監聽的埠。埠以冒號 (:) 開頭,並持續到逗號 (,)(如果提供了另一個主機)或斜槓 (/)(如果未提供)。
  • default authentication database:如果引數列表中未提供更具體的 authSource,則用於認證的資料庫名稱。如果此處或使用 authSource 未指定資料庫,MongoDB 將嘗試對標準 admin 資料庫進行認證。
  • parameter list:一個可選的額外引數列表,可以影響連線行為。引數列表以問號 (?) 開頭。如果未提供預設認證資料庫,則必須在最後一個主機定義後使用斜槓和問號 (/?) 開始引數列表。
    • parameter pairs:引數列表由鍵值對組成。每對中的鍵和值由等號 (=) 分隔,每對之間由和號 (&) 分隔。

以下是一個包含所有這些元件的 MongoDB 連線 URI 示例

mongodb://sally:sallyspassword@dbserver.example:5555/userdata?tls=true&connectionTimeout=5000
^ ^ ^ ^ ^ ^ ^
|- schema | |- password |- host | | |- parameter list
| | |
|- username | |- default authentication database
|
|- port

指定 URI 型別

連線 URI 中的專案通常是協議規範或應用程式型別。由於 URI 將用於連線和認證到 MongoDB 資料庫,我們需要使用一個識別符號來向我們正在使用的應用程式和庫表明這一點。

MongoDB 專案僅接受 mongodb 作為有效的 URI Schema 指定符。因此,你應該始終這樣開始你的連線 URI

mongodb://

Schema 指定符將確保後續資訊在正確的上下文中被解釋。

指定使用者名稱和密碼

URI 的下一部分是使用者憑據。使用者憑據是可選的,但如果你不想依賴應用程式或資料庫配置的預設值,通常是必需的。

要包含使用者憑據,請在 Schema 識別符號後提供使用者名稱,接著是冒號 (:)、密碼,最後是 at 符號 (@)

mongodb://username:password@

使用者憑據是可選的,但如果包含,你必須同時提供使用者名稱和密碼元件。

指定伺服器監聽位置

使用者憑據之後是主機指定符,它定義了伺服器的監聽位置。可以在主機指定符中定義一個或多個主機,但由於主機指定符是必需的,因此必須至少提供一個主機。

每個主機定義都包含一個 host 和一個可選的 porthost 可以是本地可解析的主機名、由 DNS 等外部名稱系統解析的名稱,或者是 IP 地址或其他直接地址。埠表示 MongoDB 在主機上監聽的埠號。

要指定應用程式應嘗試連線到本地計算機上預設的 MongoDB 埠 (27017),你可以使用

mongodb://

如果你需要包含使用者名稱和密碼,這些資訊將首先出現並由 at 符號分隔

mongodb://username:password@localhost

要指定在非標準埠上執行的遠端伺服器,請用冒號分隔這些詳細資訊。例如,要連線到 198.51.100.22 主機上的 3333 埠,你可以使用

mongodb://username:password@198.51.100.22:3333

要定義多個主機和埠對,請用逗號 (,) 分隔這些集合,以告訴應用程式如果第一個伺服器無法訪問,則嘗試後面的伺服器。例如,要擴充套件上一個示例以包含一個在 198.51.100.33 的 5555 埠上監聽的備用伺服器,你可以使用

mongodb://username:password@198.51.100.22:3333,198.51.100.33:5555

符合規範的客戶端和應用程式將首先嚐試連線到在 198.51.100.22:3333 監聽的伺服器。如果失敗,它們將嘗試連線到在 198.51.100.33:5555 監聽的 MongoDB 資料庫。

提供預設認證資料庫

在主機指定符之後,下一部分資料是預設認證資料庫。雖然並非所有資料庫管理系統都如此,但在 MongoDB 中,在建立連線時,你必須對特定的資料庫進行認證。

資料庫名稱以正斜槓 (/) 開頭,並持續到行尾或問號 (?)。如果引數列表中未提供 authSource 選項,將使用預設認證資料庫。如果兩者都未提供,客戶端將對 admin 資料庫進行認證。

要連線到在 198.51.100.22:3333 監聽的 MongoDB 伺服器上託管的名為 sales 的資料庫,你可以輸入

mongodb://username:password@198.51.100.22:3333/sales

指定額外引數

連線 URI 的最後一部分用於提供連線的額外引數。引數列表由一個前導問號 (?) 引入,並持續到行尾。如果未提供預設認證資料庫,則表示主機規範結束的尾部斜槓必須直接位於問號之前 (/?)。

列出的每個引數都定義為由等號 (=) 連線的鍵值對。在第一個引數對之後,每個額外的鍵值對都由一個和號 (&) 分隔。

例如,要指定客戶端應對我們之前定義的連線應用 10 秒超時,你可以使用

mongodb://username:password@198.51.100.22:3333/sales?connectTimeoutMS=10000

如果你想提供額外的引數,可以在後面用和號 (&) 將每個鍵值對分隔開。例如,我們還可以指定需要 SSL,並且指定的主機是我們希望連線的副本整合員

mongodb://username:password@198.51.100.22:3333,198.51.100.33:5555/sales?connectTimeoutMS=10000&tls=true&replicaSet=someReplicaSet

MongoDB 文件中有一個完整的引數列表,你可以閱讀以瞭解更多資訊。

總結

在本指南中,我們討論了 MongoDB 連線 URI 是什麼,如何解釋各個元件,以及如何根據一組連線資訊構建自己的 URI。連線 URI 將連線到給定資料庫所需的所有資訊編碼在一個字串中。由於這種靈活性及其廣泛採用,理解如何解析和構建這些字串非常有幫助。

關於作者
Justin Ellingwood

賈斯汀·埃林伍德

賈斯汀自 2013 年以來一直撰寫關於資料庫、Linux、基礎設施和開發者工具的文章。他目前與妻子和兩隻兔子住在柏林。他通常不必用第三人稱寫作,這讓所有相關方都鬆了一口氣。
© . This site is unofficial and not affiliated with Prisma Data, Inc.