MongoDB 連線

MongoDB - 連線

在本教程我們將討論 MongoDB 的不同連線方式。

啟動 MongoDB 服務

在前面的教程中,我們已經討論瞭如何啟動 MongoDB 服務,你只需要在 MongoDB 安裝目錄的 bin 目錄下執行 mongodb 即可。

執行啟動操作後,mongodb 在輸出一些必要資訊後不會輸出任何資訊,之後就等待連線的建立,當連線被建立後,就會開始列印日誌資訊。

你可以使用 MongoDB shell 來連線 MongoDB 伺服器。你也可以使用 PHP 來連線 MongoDB。本教程我們會使用 MongoDB shell 來連線 Mongodb 服務,之後的章節我們將會介紹如何通過php 來連線MongoDB服務。

標準 URI 連線語法:

mongodb://[username:[email protected]]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
  • mongodb:// 這是固定的格式,必須要指定。

  • username:[email protected] 可選項,如果設定,在連線資料庫伺服器之後,驅動都會嘗試登入這個資料庫

  • host1 必須的指定至少一個host, host1 是這個URI唯一要填寫的。它指定了要連線伺服器的地址。如果要連線複製集,請指定多個主機地址。

  • portX 可選的指定埠,如果不填,預設為27017

  • /database 如果指定username:[email protected],連線並驗證登入指定資料庫。若不指定,預設開啟 test 資料庫。

  • ?options 是連線選項。如果不使用/database,則前面需要加上/。所有連線選項都是鍵值對name=value,鍵值對之間通過&或;(分號)隔開

標準的連線格式包含了多個選項(options),如下所示:

選項 描述
replicaSet=name 驗證replica set的名稱。 Impliesconnect=replicaSet.
slaveOk=true|false
  • true:在connect=direct模式下,驅動會連線第一臺機器,即使這臺伺服器不是主。在connect=replicaSet模式下,驅動會發送所有的寫請求到主並且把讀取操作分佈在其他從伺服器。
  • false: 在 connect=direct模式下,驅動會自動找尋主伺服器. 在connect=replicaSet 模式下,驅動僅僅連線主伺服器,並且所有的讀寫命令都連線到主伺服器。
safe=true|false
    • true: 在執行更新操作之後,驅動都會發送getLastError命令來確保更新成功。(還要參考 wtimeoutMS).
false: 在每次更新之後,驅動不會發送getLastError來確保更新成功。
w=n 驅動新增 { w : n } 到getLastError命令. 應用於safe=true。
wtimeoutMS=ms 驅動新增 { wtimeout : ms } 到 getlasterror 命令. 應用於 safe=true.
fsync=true|false
  • true: 驅動新增 { fsync : true } 到 getlasterror 命令.應用於 safe=true.
  • false: 驅動不會新增到getLastError命令中。
journal=true|false 如果設定為 true, 同步到 journal (在提交到資料庫前寫入到實體中). 應用於 safe=true
connectTimeoutMS=ms 可以開啟連線的時間。
socketTimeoutMS=ms 傳送和接受sockets的時間。

例項

使用預設埠來連線 MongoDB 的服務。

mongodb://localhost

通過 shell 連線 MongoDB 服務:

$ ./mongo
MongoDB shell version: 4.0.9
connecting to: test
... 

這時候你返回檢視執行 ./mongod 命令的視窗,可以看到是從哪裡連線到MongoDB的伺服器,您可以看到如下資訊:

……省略資訊……
2015-09-25T17:22:27.336+0800 I CONTROL  [initandlisten] allocator: tcmalloc
2015-09-25T17:22:27.336+0800 I CONTROL  [initandlisten] options: { storage: { dbPath: "/data/db" } }
2015-09-25T17:22:27.350+0800 I NETWORK  [initandlisten] waiting for connections on port 27017
2015-09-25T17:22:36.012+0800 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:37310 #1 (1 connection now open)  # 該行表明一個來自本機的連線

……省略資訊……

MongoDB 連線命令格式

使用使用者名稱和密碼連線到 MongoDB 伺服器,你必須使用 'username:[email protected]/dbname' 格式,'username'為使用者名稱,'password' 為密碼。

使用使用者名稱和密碼連線登入到預設資料庫:

$ ./mongo
MongoDB shell version: 4.0.9
connecting to: test

使用使用者 admin 使用密碼 123456 連線到本地的 MongoDB 服務上。輸出結果如下所示:

> mongodb://admin:[email protected]/
... 

使用使用者名稱和密碼連線登入到指定資料庫,格式如下:

mongodb://admin:[email protected]/test

更多連線例項

連線本地資料庫伺服器,埠是預設的。

mongodb://localhost

使用使用者名稱fred,密碼foobar登入localhost的admin資料庫。

mongodb://fred:[email protected]

使用使用者名稱fred,密碼foobar登入localhost的baz資料庫。

mongodb://fred:[email protected]/baz

連線 replica pair, 伺服器1為example1.com伺服器2為example2。

mongodb://example1.com:27017,example2.com:27017

連線 replica set 三臺伺服器 (埠 27017, 27018, 和27019):

mongodb://localhost,localhost:27018,localhost:27019

連線 replica set 三臺伺服器, 寫入操作應用在主伺服器 並且分佈查詢到從伺服器。

mongodb://host1,host2,host3/?slaveOk=true

直接連線第一個伺服器,無論是replica set一部分或者主伺服器或者從伺服器。

mongodb://host1,host2,host3/?connect=direct;slaveOk=true

當你的連線伺服器有優先順序,還需要列出所有伺服器,你可以使用上述連線方式。

安全模式連線到localhost:

mongodb://localhost/?safe=true

以安全模式連線到replica set,並且等待至少兩個複製伺服器成功寫入,超時時間設定為2秒。

mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000