Node.js中使用mongoskin操作mongoDB實(shí)例

字號(hào):


    一、廢話
    從13年1月份接觸mongodb進(jìn)行開(kāi)發(fā),開(kāi)發(fā)了旅游標(biāo)簽服務(wù)、微博標(biāo)簽檢索系統(tǒng)、地圖服務(wù)、web APP服務(wù)...使用MongoDB的場(chǎng)景從.NET、JAVA環(huán)境轉(zhuǎn)到了node.js平臺(tái)。越發(fā)覺(jué)Node.js和mongodb結(jié)合感覺(jué)的很好。感覺(jué)mongodb和node.js是天生的一對(duì)。的確,mongodb的客戶端是JS的解析引擎。因此,選擇mongodb和node.js做產(chǎn)品原型也是很nice的選擇。網(wǎng)上,遇到網(wǎng)友詢問(wèn)mongodb的開(kāi)發(fā),選擇哪個(gè)driver最好,以前一直是使用原生的driver,但是寫起來(lái)代碼有很多需要注意的,比如連接的關(guān)閉操作等等...因此,在node.js開(kāi)發(fā)環(huán)境下我這里推薦使用mongoskin。
    二、幾個(gè)需要說(shuō)的概念
    (1)數(shù)據(jù)庫(kù):同關(guān)系數(shù)據(jù)庫(kù)一樣。
    (2)集合: 關(guān)系數(shù)據(jù)庫(kù)中的表。
    (3)文檔: 類比關(guān)系數(shù)據(jù)庫(kù)的記錄,實(shí)則是JSON對(duì)象。
    (4)數(shù)據(jù)庫(kù)設(shè)計(jì):建議考慮NoSQL設(shè)計(jì),拋棄關(guān)系數(shù)據(jù)的設(shè)計(jì)思想;其實(shí)NoSQL數(shù)據(jù)庫(kù)設(shè)計(jì)博大精深,需要不斷地在項(xiàng)目中實(shí)踐。
    (5)用戶體系:每一個(gè)數(shù)據(jù)庫(kù)都有自己的管理員,可以:
    代碼如下:
    use dbname; db.addUser('root_1' , 'test');
    (7)建議更改對(duì)外端口
    (8)啟動(dòng)服務(wù)(這是win下,linux下稍作修改):
    代碼如下:
    mongod --dbpath "XX\MongoDB\data\db" --logpath "XX\MongoDB\log\mongo.log" --logappend -auth --port 7868
    三、搭建mongodb開(kāi)發(fā)基礎(chǔ)設(shè)施
    (0) npm install mongoskin 安裝mongoskin
    這里不介紹Node.js安裝、package等機(jī)制。
    (1)創(chuàng)建配置文件 config.json
    代碼如下:
    {
    "dbname":"TEST",
    "port": "7868",
    "host": "127.0.0.1",
    "username": "test",
    "password": "test"
    }
    (2)創(chuàng)建util相關(guān)類mongo.js :導(dǎo)出一個(gè)DB對(duì)象
    代碼如下:
    var mongoskin = require('mongoskin'),
    config = require('./../config.json');
    /*
    * @des:導(dǎo)出數(shù)據(jù)庫(kù)連接模塊
    * */
    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)構(gòu)建CRUD的基礎(chǔ)類:為了減少重復(fù)CURD代碼,只需要傳入相關(guān)的JSON對(duì)象即可
    代碼如下:
    var db = require('./mongo.js'),
    status = require('./status'),
    mongoskin = require('mongoskin');
    var CRUD = function(collection){
    this.collection = collection;
    db.bind(this.collection);
    };
    CRUD.prototype = {
    /*
    * @des: 創(chuàng)建一條記錄
    * @model: 插入的記錄,JSON格式的model
    * @callback:回調(diào),返回插入成功的記錄或者失敗信息
    *
    * */
    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:回調(diào),返回符合要求的記錄或者失敗信息
    *
    * */
    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字面量,此處為_(kāi)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)構(gòu)建status.json,因?yàn)樾枰恍顟B(tài)表示成功和失敗,后期可以拓展為驗(yàn)證碼錯(cuò)誤、短信驗(yàn)證錯(cuò)誤、用戶名錯(cuò)誤等
    代碼如下:
    module.exports = {
    /*
    * 成功狀態(tài)
    *
    * */
    success: {
    status: 1,
    message: 'OK'
    },
    /*
    * 失敗狀態(tài)
    *
    * */
    fail: {
    status: 0,
    message: 'FAIL'
    },
    /*
    * 兩次輸入的密碼不一致
    * */
    repeatPassword: {
    status: 0,
    message: '兩次輸入的密碼不一致'
    }
    };