2012年2月14日

mongoskin - a better MongoDB driver for Node.js

MongoDB 是新興的 NOSQL solution;Node.js 是新興的 Web Framework。

要把它們湊成一對,首先要解決的問題就是用什麼 driver(亦稱 library 或 module)。

在 MongoDB 的網站,有一份清楚的列表:

http://www.mongodb.org/display/DOCS/node.JS

我第一次在 demo 專案中使用的 driver 是 mongoose,它確實能 work,也是不錯的 ORM/ODM 解決方案。

Mongoose http://mongoosejs.com/

不過,當我更深入瞭解 MongoDB 之後,我發現 mongoose 的設計不太對勁,主要的問題是它對 Schema/Model 的依賴。對於 MVC 的架構來說,定義 Model 是天經地義的事;但有時候我們可能想善用 MongoDB 的 schema-free 特性來設計更具彈性的系統架構,這時候以 schema 為基礎的設計就不太合適。

於是我將 mongoose 拆除,使用更低階的 native driver,這也是 mongoose 所採用的底層,它的 npm 名稱就叫「mongodb」。

Mongo DB Native NodeJS Driver https://github.com/christkv/node-mongodb-native

但實際使用 native driver 不久後就感到厭煩,也體悟到為何大多文章推 mongoose 或其他 wrapper 的原因;光是一個最簡單的 find 查詢,native driver 就需要撰寫許多層的 callback function,才能完成,而它的 async 特性也讓處理查詢結果的 code,必須塞在多層 callback 的最內層,程式的可維護性降低不少。

我試著撰寫一些 function 讓簡易查詢可以用一層完成,但總覺得這件事情不應該自己做,於是我想再嘗試尋找更好的方案。

當我試著在 Cloud9 建立 Node.js 的測試專案,並且使用 MongoHQ 的資料儲存服務時,發現 mongoskin 也許正是我想要的。(Cloud9 是線上的專案開發工具,MongoHQ 是雲端的資料庫儲存服務,搭配起來就可以只用瀏覽器開發 Web App。)

Mongoskin https://github.com/guileen/node-mongoskin

我想 mongoskin 應該會是個不錯的選擇,就像它自己宣稱的「The future layer for node-mongodb-native.」。使用 mongoskin 存取資料,使用方法比較接近 mongo shell,有一點 DSL 的味道,少了一層又一層無止盡的 callback。mongoskin 透過 Helper 的方式滿足簡易的 Model 需求,例如幫 posts 這個 collection 封裝,加入 findTo10 函式。

以下的 sample code 可以整理這三種 module 的示範:

1 則留言:

  1. 謝謝,我也想試試,那裏可以找到更多範例?

    回覆刪除

lyhcode by lyhcode
歡迎轉載,請務必註明出處!