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 相关文章推荐
基于jQuery的history历史记录插件
Dec 11 Javascript
可恶的ie8提示缺少id未定义
Mar 20 Javascript
js 判断一组日期是否是连续的简单实例
Jul 11 Javascript
IntersectionObserver API 详解篇
Dec 11 Javascript
Vue上传组件vue Simple Uploader的用法示例
Aug 25 Javascript
微信小程序提取公用函数到util.js及使用方法示例
Jan 10 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
Feb 17 Javascript
原生js实现的金山打字小游戏(实例代码详解)
Mar 16 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
Apr 27 Javascript
jQuery实现视频展示效果
May 30 jQuery
基于原生js实现判断元素是否有指定class名
Jul 11 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
Jul 13 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的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
详解PHP中的Traits
2015/07/29 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
jQuery对象和Javascript对象之间转换的实例代码
2013/03/20 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
Python将多个excel文件合并为一个文件
2018/01/03 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
Python实战购物车项目的实现参考
2019/02/20 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
哪些是python中web开发框架
2020/06/17 Python
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
VIVOBAREFOOT赤脚鞋:让您的脚做自然的事情
2017/06/01 全球购物
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
五年级科学教学反思
2014/02/05 职场文书
个人工作表现自我评价
2015/03/06 职场文书
中学推普周活动总结
2015/05/07 职场文书
新员工辞职信范文
2015/05/12 职场文书
律师催款函范文
2015/06/24 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书