爲進一步完善框架應用,本次系列文章主要是介紹如何完善架構功能,以及如何應用架構做一些具體的應用開發。本系列課程可以在github上找到相應資源,具體每篇文章中都會提供鏈接。
本次介紹的主要是mongo基類的設計,以及應用。相關請查看文章下面鏈接下載http://5xpan.com/fs/7hueanfgd6h350fe4/(下載鏈接有收益,請原諒有廣告)。
如果你嫌棄慢的話,也可以直接去github(https://github.com/tnodejs/BaseMongodb)
主要函數結構
私有方法
connection
該函數主要是創建mongodb鏈接,並將鏈接對象緩存。
function connection(tableName, callback){
var connect_url = get_db_connect_url();
if(DB_TMP['db']){
DB_TMP['db'].collection(tableName, function(err, collection){
if(err){
console.log('basemongo can not connection with db table error');
process.exit(1);
}
callback(collection);
});
return;
}
MongoClient.connect(connect_url, {native_parser:true}, function(err, db) {
if(err){
console.log('basemongo can not connection with db');
process.exit(1);
}
DB_TMP['db'] = db;
if(!tableName){
return;
}
db.collection(tableName, function(err, collection){
if(err){
console.log('basemongo can not connection with db table error');
process.exit(1);
}
callback(collection);
});
});
}
該方法中調用了,本基類中的get_db_connect_url方法,主要是爲了獲取DB連接字符。
get_db_connect_url
獲取db的鏈接字符串,該函數主要被connection調用。
function get_db_connect_url(){
/*var dbConfig = LIBRARY.getConfig('mongodb', 'db');
var host = dbConfig['host']
, port = dbConfig['port']
, dbName = dbConfig['db_name']
, user = dbConfig['user']
, password = dbConfig['password'];
*/
var host = 'localhost';
var port = '27017';
var user = '';
var password = '';
var dbName = 'test_book';
if(!user && !password){
return "mongodb://" + host + ":" + port + "/" + dbName;
}
return "mongodb://" + user + ":" + password + "@" + host + ":" + port + "/" + dbName;
}
方法中本應該讀取配置文件,這部分爲了省事直接寫在函數中,讀者使用時,請使用讀取配置方法獲取。
filter_options
對查詢功能中的一些基本操作sort、limit以及skip等做一個filter,統一處理邏輯。
function filter_options(){
var fields = arguments[0] ? arguments[0] : null;
var limit = arguments[1] ? arguments[1] : 0;
var sort = arguments[2] ? arguments[2] : null;
var skip = arguments[3] ? arguments[3] : 0;
var options = {};
if(limit !== 0){
options.limit = limit;
}
if(skip !== 0){
options.skip = skip;
}
if(fields){
options.fields = fields;
}
if(sort){
options.sort = sort;
}
options.timeout = timeout ;
return options;
}
get_result
由於mongodb的基礎庫返回的數據非常多,這部分就是將mongodb操作後返回的數據做一層處理,從而在外層調用可以清晰的知道返回結果信息。
/**
* @desc 對mongodb庫返回做filter
*
*/
function get_result(result){
if(!result['result']){
return false;
}
if(result['result']['ok'] != 1){
return false;
}
if(result['result']['n'] < 1){
return false;
}
return true;
}
公有方法
initConnecnt
該方法初始化mongodb鏈接對象。在一般情況下是不需要調用該函數,但是在特殊情況下,該函數可以彌補一些同時多請求導致的bug問題。具體的話可以參考我之前的一篇文章《Node.js執行流程圖引發的思考》
/**
* @desc 初始化mongodb的連接對象
*
*/
this.initConnecnt = function(){
connection(false, function(db){
DB_TMP['db'] = db;
});
}
findOne
查詢單條數據記錄,只返回單條數據,如果未找到數據返回空,異常會打印error信息,並返回false。
參數名稱 | 參數類型 | 參數說明 | 參數示例 |
---|---|---|---|
tableName | string | 操作的表名 | book |
condition | json | 查詢條件 | {‘name’:1} |
fields | json | 返回的字段 | {‘_id’:1, ‘name’:1} |
方法的示例請參考源碼example中的findOne.js
find
查詢多條數據記錄,如果未找到數據返回空,異常會打印error信息,並返回false。
參數名稱 | 參數類型 | 參數說明 | 參數示例 |
---|---|---|---|
tableName | string | 操作的表名 | book |
condition | json | 查詢條件 | {‘name’:1} |
callback | function | 回調函數 | function(err, result){} |
fields | json | 返回的字段 | {‘_id’:1, ‘name’:1} |
limit | int | 返回條數 | 5 |
skip | int | 跳過的條數 | 5 |
sort | json | 排序字段 | {‘name’:1} |
insert
插入多條數據,返回插入數據列表。
參數名稱 | 參數類型 | 參數說明 | 參數示例 |
---|---|---|---|
tableName | string | 操作的表名 | book |
rowInfos | array | 插入的數據數組 | [{‘name’:’danhuang’}] |
callback | function | 回調函數 | function(err, result){} |
save
插入單條數據,返回被插入數據的mongo id。
參數名稱 | 參數類型 | 參數說明 | 參數示例 |
---|---|---|---|
tableName | string | 操作的表名 | book |
rowInfo | json | 插入的數據 | {‘name’:’danhuang’} |
callback | function | 回調函數 | function(err, result){} |
remove(findAndRemove)
刪除數據,可刪除單條,也可刪除所有符合條件的。括號中的爲查詢並刪除。
參數名稱 | 參數類型 | 參數說明 | 參數示例 |
---|---|---|---|
tableName | string | 操作的表名 | book |
condition | json | 查詢條件 | {‘name’:1} |
removeAll | boolean | 刪除全部 | true |
callback | function | 回調函數 | function(err, result){} |
update(findAndModify)
更新單條數據,括號中的爲查詢並修改。
參數名稱 | 參數類型 | 參數說明 | 參數示例 |
---|---|---|---|
tableName | string | 操作的表名 | book |
condition | json | 查詢條件 | {‘name’:1} |
rowInfo | json | 插入的數據 | {‘name’:’danhuang’} |
update_set | boolean | 是否局部更新 | true |
callback | function | 回調函數 | function(err, result){} |
updateAll
更新多條數據。
參數名稱 | 參數類型 | 參數說明 | 參數示例 |
---|---|---|---|
tableName | string | 操作的表名 | book |
condition | json | 查詢條件 | {‘name’:1} |
rowInfo | json | 插入的數據 | {‘name’:’danhuang’} |
update_set | boolean | 是否局部更新 | true |
callback | function | 回調函數 | function(err, result){} |
count
查詢符合條件的數據數量。
參數名稱 | 參數類型 | 參數說明 | 參數示例 |
---|---|---|---|
tableName | string | 操作的表名 | book |
condition | json | 查詢條件 | {‘name’:1} |
callback | function | 回調函數 | function(err, result){} |
示例介紹
數據層操作類
可以直接的將該類作爲數據層的操作類,開發者可以直接調用該模塊進行開發,例如下面代碼。
數據插入示例
ar Basemongo = require('./basemongo');
var basemongo = new Basemongo();
var rowInfos = [
{
'name' : 'mongo2',
'test_url' : 'http://blog.lovedan.cn',
'download_book' : 'http://download.lovedan.cn',
'create_time' : new Date()
},
{
'name' : 'mongo3',
'test_url' : 'http://blog.lovedan.cn',
'download_book' : 'http://download.lovedan.cn',
'create_time' : new Date()
}
];
basemongo.insert('book', rowInfos, function(result){
if(false === result){
console.log('insert error');
} else {
console.log(result);
}
});
數據查詢示例
/* condition fields */
var condition = {'test_url' : 'http://blog.lovedan.cn'};
var fields = {"create_time":0};
/* test for find rowinfo */
basemongo.find('book', condition, function(result){
if(false === result){
console.log('find error');
} else {
console.log(result);
}
}, fields);
等等,具體請查看源碼中的測試代碼。
作爲基類
當然也可以將該模塊作爲基類,提供其他模塊層類調用,這樣將其作爲父類方法,示例代碼如下。
/**
*
* @type class
* @author danhuang
* @time 2015-04-07
* @desc 主要用於新增book數據
*/
var Model = require('../../basemongo');
var SYS = require('util');
function Book(){
var _self = this;
var _tableName = 't_book';
Model.call(_self);
SYS.inherits(_self, Model);
this.addDataInDb = function(rowInfo, callback){
_self.save(_tableName, rowInfo, function(ret){
if(ret){
callback(ret);
} else {
callback(false);
}
});
};
}
var book = new Book();
exports.addDataInDb = book.addDataInDb;
那麼以上模塊層類,就可以直接被controller層或者其他模塊層調用,如下調用方式。
var book = require('./model_extended/book');
var rowInfo = {
'name' : 'Node.js book',
'author' : 'danhuang',
'desc' : 'good book',
'catalogue' : ['1', '2'],
'content' : 'dasadasdasdasd',
'cover' : 'http://blog.lovedan.cn',
'pic_urls' : 'http://download.lovedan.cn',
'category_ids' : ['1', '2'],
'pdf_url' : 'http://download.lovedan.cn',
'download_url' : 'http://download.lovedan.cn',
'download_tips' : 'dddd',
'buy_list' : 'http://blog.lovedan.cn'
};
book.addDataInDb(rowInfo, function(ret){
console.log(ret);
});
具體就看哪種需要了,如果你覺得基類對你有幫助的話,幫忙去該網站註冊一下,給博主帶來綿薄的收益。
http://dd.ma/4hXDyCkp