Node.js中使用mongoskin操作mongoDB实例


Posted in Javascript onSeptember 28, 2014

一、废话

从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)用户体系:每一个数据库都有自己的管理员,可以:

use dbname; db.addUser('root_1' , 'test');

(7)建议更改对外端口
(8)启动服务(这是win下,linux下稍作修改):
mongod --dbpath "XX\MongoDB\data\db" --logpath "XX\MongoDB\log\mongo.log" --logappend -auth --port 7868

三、搭建mongodb开发基础设施

(0) npm install mongoskin 安装mongoskin

这里不介绍Node.js安装、package等机制。

(1)创建配置文件 config.json

{

    "dbname":"TEST",

    "port": "7868",

    "host": "127.0.0.1",

    "username": "test",

    "password": "test"

}

(2)创建util相关类mongo.js :导出一个DB对象

var mongoskin = require('mongoskin'),

    config = require('./../config.json');
/*

 * @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 db = require('./mongo.js'),

    status = require('./status'),

    mongoskin = require('mongoskin');


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,因为需要一些状态表示成功和失败,后期可以拓展为验证码错误、短信验证错误、用户名错误等

module.exports = {

    /*

    * 成功状态

    *

    * */

    success: {

        status: 1,

        message: 'OK'

    },
    /*

    * 失败状态

    *

    * */

    fail: {

        status: 0,

        message: 'FAIL'

    },
    /*

    * 两次输入的密码不一致

    * */

    repeatPassword: {

        status: 0,

        message: '两次输入的密码不一致'

    }

 };
Javascript 相关文章推荐
html5的自定义data-*属性和jquery的data()方法的使用示例
Aug 21 Javascript
jQuery子属性过滤选择器用法分析
Feb 10 Javascript
javascript实现根据3原色制作颜色选择器的方法
Jul 17 Javascript
javascript省市级联功能实现方法实例详解
Oct 20 Javascript
jquery实现横向图片轮播特效代码分享
Nov 19 Javascript
JS针对Array的各种操作汇总
Nov 29 Javascript
Vue基于NUXT的SSR详解
Oct 24 Javascript
js实现登录与注册界面
Nov 01 Javascript
开发用到的js封装方法(20种)
Oct 12 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
Jul 24 Javascript
layui table复选框禁止某几条勾选的实例
Sep 20 Javascript
浅谈JavaScript中this的指向问题
Jul 28 Javascript
js使用for循环与innerHTML获取选中tr下td值
Sep 26 #Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
Sep 26 #Javascript
简单方法判断JavaScript对象为null或者属性为空
Sep 26 #Javascript
jquery uploadify 在FF下无效的解决办法
Sep 26 #Javascript
jQuery判断当前点击的是第几个li的代码
Sep 26 #Javascript
javascript 自定义回调函数示例代码
Sep 26 #Javascript
jquery和js实现对div的隐藏和显示方法
Sep 26 #Javascript
You might like
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
提高php编程效率技巧
2015/08/13 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
javascript 命名规则 变量命名规则
2010/02/25 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
python清除字符串前后空格函数的方法
2018/10/21 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
Yahoo-PHP面试题3
2012/01/14 面试题
了解AppleTalk协议吗
2014/04/01 面试题
资深财务管理人员自我评价
2013/09/22 职场文书
运动会领导邀请函
2014/01/10 职场文书
财产保全担保书范文
2014/04/01 职场文书
小学英语课后反思
2014/04/26 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
2016年清明节寄语
2015/12/04 职场文书