设计模式知识连载(39)---数据访问对象模式---MongoDB

<body>


<h3>设计模式知识连载(39)---数据访问对象模式:</h3>
<p>
    抽象和封装对数据源的访问和存储,DAO通过对数据源链接的管理方便对数据的访问与存储
</p>

<hr>



<script type="text/javascript">



    /**
    *   案例二:MongoDB,方式一:初始
    */

    // 在nodejs中写入配置项
    /* config.js*/
    // 将配置数据输出
    module.exports = {
        // 数据库相关配置数据
        DB : {
            db   : 'demo',      // 数据库名称
            host : 'localhost', // 主机名
            port : 27017        // 端口号
        }
    }


    // 链接MongoDB
    /* db.js */
    // 引用mongodb模块
    var mongodb = require('mongodb') ;
    // 引用配置模块的数据库配置信息
    var config = require('./config') ;
    var _DB = config.DB ;
    // 创建数据库对象
    var d = new mongodb.Db(
        _DB.db,                     // 数据库名称
        new mongodb.Server(
            _DB.host,               // 主机名
            _DB.port,               // 端口
            {auto_reconnect : true} // 自动链接
        ),
        {safe : true}               // 安全模式
    ) ; 
    // 输出数据访问对象
    exports.DB = function(){} ;

    // 操作集合
    /***
    *   打开数据库, 操作集合
    *   @param col  集合名
    *   @param fn   操作方法
    **/
    function connect(col, fn) {
        // 打开数据库
        DB.open(function(err, db) {
            // 打开数据库报错则抛出错误
            if(err) {
                throw err ;
            // 没报错,就操作集合
            }else {
                db.collection(col, function(err, col) {
                    // 打开数据库报错则抛出错误
                    if(err) {
                        throw err ;
                    // 没报错,就操作集合
                    }else {
                        fn && fn(col, db) ;
                    }
                }) ;
            }

        }) ;
    }

    // 要执行的增删改查操作要在connect的fn中实现
    exports.DB = function(col) {
        return {
            /***
            *   插入数据
            *   @param  data        插入数据项
            *   @param  success     操作成功回调函数
            *   @param  fail        操作失败回调函数
            ***/
            insert : function(data, success, fail) {
                // 打开数据库操作col集合
                connect(col, function(col, db) {
                    // 向集合中插入数据
                    col.insert(data, function(err, docs) {
                        // 失败,则抛出插入错误
                        if(err) {
                            fail && fail(err) ;
                        // 成功,则执行成功回调函数 
                        }else {
                            success && success(docs) ;
                        }
                        // 关闭数据库
                        db.close() ;
                    }) ;
                }) ;
            },
            /***
            *   删除数据
            *   @param  data        删除数据项
            *   @param  success     操作成功回调函数
            *   @param  fail        操作失败回调函数
            ***/
            remove : function(data, success, fail) {
                // 打开数据库操作col集合
                connect(col, function(col, db) {
                    // 删除集合中的数据
                    col.remove(data, function(err, len) {
                        // 失败,则抛出删除错误
                        if(err) {
                            fail && fail(err) ;
                        // 成功,则执行成功回调函数 
                        }else {
                            success && success(len) ;
                        }
                        // 关闭数据库
                        db.close() ;
                    }) ;
                }) ;
            },
            /***
            *   查找数据
            *   @param  con         查找条件
            *   @param  success     操作成功回调函数
            *   @param  fail        操作失败回调函数
            ***/
            find : function(con, success, fail) {
                // 打开数据库操作col集合
                connect(col, function(col, db) {
                    // 在集合中查找数据
                    col.find(con).toArray(function(err, docs) {
                        // 失败,则抛出查找错误
                        if(err) {
                            fail && fail(err) ;
                        // 成功,则执行成功回调函数 
                        }else {
                            success && success(docs) ;
                        }
                        // 关闭数据库
                        db.close() ;
                    }) ;
                }) ;
            },
            /***
            *   更新数据 
            *   @param  con         筛选条件
            *   @param  data        更新数据项
            *   @param  success     操作成功回调函数
            *   @param  fail        操作失败回调函数
            ***/
            updata : function(con, data, success, fail) {
                // 打开数据库操作col集合
                connect(col, function(col, db) {
                    // 在集合中更新数据
                    col.updata(con, data, function(err, len) {
                        // 失败,则抛出更新错误
                        if(err) {
                            fail && fail(err) ;
                        // 成功,则执行成功回调函数 
                        }else {
                            success && success(len) ;
                        }
                        // 关闭数据库
                        db.close() ;
                    }) ;
                }) ;
            }
        }
    } ;



    // 实例操作
    /* test.js */

    var db = require('./db') ;  // 引用数据访问对象模块
    var DB = db.DB ;

    // 操作user集合
    var user = DB('user') ;     
    // 向集合中插入一条数据
    user.insert({
        name : '小白', nick : '雨打芭蕉'
    }, function(docs) {
        console.log(docs) ;
    }) ;
    // 删除
    user.remove({name : '小白'}, function(len) {
        console.log(len) ;  // 1 (删除数据项长度) 
    }) ;
    // 查找
    user.find({name : '小白'}, function(docs) {
        console.log(docs) ;
    }) ;
    // 更新
    user.updata({name : '小白'}, {name : '小白', nick : '雨夜'}, function(len) {
            console.log(len) ;  // 1 (更新的数据项长度) 
    }) ;

    // 操作书籍集合
    var book = DB('book') ;
    book.insert({title : 'JavaScript设计模式', type : 'javascript'}) ;
</script>    

</body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值