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 插件 任意位置浮动固定层
Dec 25 Javascript
javascript 面向对象全新理练之原型继承
Dec 03 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
Mar 15 Javascript
浅析hasOwnProperty方法的应用
Nov 20 Javascript
关于数据与后端进行交流匹配(点亮星星)
Aug 03 Javascript
JS操作xml对象转换为Json对象示例
Mar 25 Javascript
一个可复用的vue分页组件
May 15 Javascript
Vue隐藏显示、只读实例代码
Jul 18 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
Jul 24 Javascript
微信小程序如何调用新闻接口实现列表循环
Jul 02 Javascript
javascript事件监听与事件委托实例详解
Aug 16 Javascript
JavaScript代码简化技巧实例解析
Sep 09 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
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
Ajax+Jpgraph实现的动态折线图功能示例
2019/02/11 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
PHP数组实际占用内存大小原理解析
2020/12/11 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
js点击选择文本的方法
2015/02/09 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
原生js实现购物车
2020/09/23 Javascript
python进阶教程之循环对象
2014/08/30 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
中专生自我鉴定
2013/12/17 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
继承公证书格式
2015/01/26 职场文书
三年级作文之小小梦想
2019/12/06 职场文书