首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BaseMongo基类设计

BaseMongo基类设计

作者头像
蛋未明
发布2018-06-07 15:57:30
9700
发布2018-06-07 15:57:30
举报
文章被收录于专栏:蛋未明的专栏蛋未明的专栏

为进一步完善框架应用,本次系列文章主要是介绍如何完善架构功能,以及如何应用架构做一些具体的应用开发。本系列课程可以在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

博文来自:http://blog.lovedan.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年04月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 主要函数结构
    • 私有方法
      • connection
      • get_db_connect_url
      • filter_options
      • get_result
    • 公有方法
      • initConnecnt
      • findOne
      • find
      • insert
      • save
      • remove(findAndRemove)
      • update(findAndModify)
      • updateAll
      • count
  • 示例介绍
    • 数据层操作类
      • 作为基类
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档