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 相关文章推荐
JavaScript 给汉字排序实例代码
Jun 28 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 Javascript
JS实现随机乱撞彩色圆球特效的方法
May 05 Javascript
JavaScript类型系统之Object详解
Jan 07 Javascript
javascript断点调试心得分享
Apr 23 Javascript
聊一聊jQuery插件uploadify使用方法
Aug 24 Javascript
AngularJs 动态加载模块和依赖
Sep 15 Javascript
socket.io实现在线群聊功能
Apr 07 Javascript
jQuery实现简单的计时器功能实例分析
Aug 29 jQuery
js禁止Backspace键使浏览器后退的实现方法
Sep 01 Javascript
webpack分离css单独打包的方法
Jun 12 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
Mar 24 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压缩和解压缩字符串的方法
2015/03/14 PHP
前端必学之PHP语法基础
2016/01/01 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
py中的目录与文件判别代码
2008/07/16 Python
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
植物选择:Botanic Choice
2017/02/15 全球购物
苹果Mac升级:MacSales.com
2017/11/20 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
计算机大学生的自我评价
2013/10/15 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
节水倡议书
2015/01/19 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python