Azure Cosmos DB 的 MongoDB 相容性初探

Microsoft Azure 家族在 2017 年 5 月的 //Build/ 2017 開發者大會中將原本的 Azure Document DB 加強改版後推出 Azure Cosmos DB,支援了 key-valuedocumentcolumn family (預定)、以及 graph 這些資料模型的 NoSQL 資料庫。而其實早在 //Build/ 2016 時就宣佈過 Azure Document DB 在 API 層相容 MongoDB 的 API,所以這篇文章將用一個小專案試試看相容性。

Azure Cosmos DB 支援多種資料模型,也支援對應的 API/SDK 存取

挑選專案

由於使用 MongoDB 的團隊(個人經驗)很高的比例是使用 Nodejs 及其生態系來開發專案,所以我挑選一個使用 MEAN (MongoDB + Express + Angular + Node) 架構所寫成的 ToDo 小軟體:node-todo 來做實驗。

從它的程式碼 (server.js) 內容來看,它是使用 mongoose 這套函式庫來存取 MongoDB:

mongoose.connect(database.localUrl); // Connect to local MongoDB instance. A remoteUrl is also available (modulus.io)

所以如果我讓這個專案中的 mongoose 連接 Azure Cosmos DB ,且不改其它程式碼,網站本身還不會壞掉的話,那應該就還算有一定程度的可用性吧!

測試流程

修改資料庫的連結

在這個專案中,它用了一個 database 的模組來設定 localUrl 以及 remoteUrl,我不是很喜歡這種把連結設定或是金鑰寫在程式碼裡的作法(一不小心就把這些敏感資料 commit 進 repo 裡…),取而代之的會以 environment variable 的方式在部署的環境中才帶入,所以我稍稍修改了上面那段程式碼:

mongoose.connect(process.env.MONGODBURL || database.localUrl);

這樣我在開發環境(本地端)時可以就用開發機上的 MongoDB 來測試,而到了上線環境時,只要設定好 MONGODBURL 這個環境變數的值,自然就能切換到上線環境的 “MongoDB”。

使用 Azure Cosmos DB

Azure Cosmos DB 是個支援多種資料模型的資料庫,但不代表它可以在運行期間同時支援多種資料模型,而是在建立時就要選擇其中一種,所以記得要選擇 MongoDB API:

建立支援 MongoDB API 的 Azure Cosmos DB

選用 MongoDB(或 DocumentDB)的 API 之後,Azure Cosmos DB 的管理及資料存放的方式就與這些 document-based 的資料庫沒什麼兩樣,階層有 database — collection — document 這樣,而且打開它的連線資訊,可以看到它貼心地準備好了 MongoDB 的連接字串,可以直接把這串餵給 mongoose 來連接:

找到 MongoDB 的連接字串,可以直接提供給絕大多數的 MongoDB 函式庫使用

有了這項資訊後,在啟動 node-todo 專案前,先設定環境變數 MONGODBURL 為這個連接字串,啟動後就會發現程式可以正常地執行,試著新增幾項 todo 資料、再刪除它,應該也都會沒什麼問題。

可以正常運作的 node-todo
由 mongoose 建立的 “MongoDB” database 及 collection 在 Azure Cosmos DB 上完全正常

結論

當然這只是一個很簡單的測試,也不代表所有的情況都能那麼順利,不過 Azure Cosmos DB 團隊的目標就是希望做到完全相容,如果你有在使用 MongoDB 來運作系統,不妨可以評估看看這個不必費心維運、又有全球延展性的資料庫服務吧!

Show your support

Clapping shows how much you appreciated Eric ShangKuan’s story.