一、廢話
從13年1月份接觸mongodb進行開發,開發了旅遊標籤服務、微博標籤檢索系統、地圖服務、web APP服務...使用MongoDB的場景從.NET、JAVA環境轉到了node.js平台。越發覺Node.js和mongodb結合感覺的很好。感覺mongodb和node.js是天生的一對。的確,mongodb的客戶端是JS的解析引擎。因此,選擇mongodb和node.js做產品原型也是很nice的選擇。網路上,遇到網友詢問mongodb的開發,選擇哪個driver最好,以前一直是使用原生的driver,但是寫起來代碼有很多需要注意的,比如連接的關閉操作等等...因此,在node.js開發環境下我這裡推薦使用mongoskin。
二、幾個需要說的概念
(1)資料庫:同關係資料庫一樣。
(2)集合: 關係資料庫中的表。
(3)文件: 類比關係型資料庫的記錄,實則是JSON物件。
(4)資料庫設計:建議考慮NoSQL設計,拋棄關聯式資料的設計想法;其實NoSQL資料庫設計博大精深,需要不斷在專案中實踐。
(5)使用者係統:每個資料庫都有自己的管理員,可以:
三、搭建mongodb開發基礎設施
(0) npm install mongoskin 安裝mongoskin
這裡不介紹Node.js安裝、package等機制。
(1)建立設定檔 config.json
(2)建立util相關類別mongo.js :匯出一個DB物件
/*
* @des:匯出資料庫連線模組
* */
module.exports = (function(){
var host = config.host,
port = config.port,
dbName = config.dbname,
userName = config.username,
password = config.password,
str = 'mongodb://' userName ':' password '@' host ':' port '/' dbName;
var option = {
native_parser: true
};
return mongoskin.db(str, option);
})();
(3)建構CRUD的基礎類別:為了減少重複CURD程式碼,只需要傳入相關的JSON物件即可
var CRUD = function(collection){
this.collection = collection;
db.bind(this.collection);
};
CRUD.prototype = {
/*
* @des: 建立一筆記錄
* @model: 插入的記錄,JSON格式的model
* @callback:回調,返回插入成功的記錄或失敗訊息
*
* */
create: function(model, callback){
db[this.collection].save(model, function(err, item){
if(err) {
return callback(status.fail);
}
item.status = status.success.status;
item.message = status.success.message;
return callback(item);
});
},
/*
* @des:讀一筆記錄
* @query:查詢條件,Mongo查詢的JSON字面量
* @callback:回調,回傳符合要求的記錄或失敗訊息
*
* */
read: function(query, callback){
db[this.collection].find(query).toArray(function(err, items){
if(err){
return callback(status.fail);
}
var obj = {
status: status.success.status,
message: status.success.message,
items: items
};
return callback(obj);
});
},
/*
* @des:更新一筆記錄
* @query:查詢條件,Mongo查詢的JSON字面量,此處為_id
* @updateModel:需要更新的JSON格式的模型
* @callback:返回成功或失敗訊息
*
* */
update: function(query, updateModel, callback){
var set = {set: updateModel};
db[this.collection].update(query, set, function(err){
if(err){
return callback(status.fail);
}else{
return callback(status.success);
}
});
},
/*
* @des:刪除一筆記錄
* @query:查詢條件,Mongo查詢的JSON字面量
* @callback:回傳失敗或成功的訊息
*
* */
deleteData: function(query, callback){
db[this.collection].remove(query, function(err){
if(err){
return callback(status.fail);
}
return callback(status.success);
});
}
};
module.exports = CRUD;
(4)建構status.json,因為需要一些狀態表示成功與失敗,後期可以拓展為驗證碼錯誤、簡訊驗證錯誤、使用者名稱錯誤等
/*
* 失敗狀態
*
* */
fail: {
status: 0,
message: 'FAIL'
},
/*
* 兩次輸入的密碼不一致
* */
repeatPassword: {
status: 0,
message: '兩次輸入的密碼不一致'
}
};