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 的Document属性和方法集合
Jan 25 Javascript
jQuery实现异步获取json数据的2种方式
Aug 29 Javascript
js控制输入框获得和失去焦点时状态显示的方法
Jan 30 Javascript
Angularjs实现多个页面共享数据的方式
Mar 29 Javascript
纯js实现手风琴效果代码
Apr 17 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
May 12 Javascript
Three.js利用顶点绘制立方体的方法详解
Sep 27 Javascript
Angular 4中如何显示内容的CSS样式示例代码
Nov 06 Javascript
js实现图片粘贴上传到服务器并展示的实例
Nov 08 Javascript
利用不到200行代码写一款属于你自己的js类库
Jul 08 Javascript
如何在vue 中引入使用jquery
Nov 10 jQuery
JavaScript实现简单拖拽效果
Sep 15 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
apache mysql php 源码编译使用方法
2012/05/03 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
php递归json类实例
2014/12/02 PHP
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
npm qs模块使用详解
2020/02/07 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
[04:40]DOTA2-DPC中国联赛1月26日Recap集锦
2021/03/11 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
python 字符串和整数的转换方法
2018/06/25 Python
python爬取内容存入Excel实例
2019/02/20 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
python中setuptools的作用是什么
2020/06/19 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
挂科检讨书范文
2014/02/20 职场文书
老公保证书范文
2014/04/29 职场文书
工作保证书
2015/01/17 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
Go 内联优化让程序员爱不释手
2022/06/21 Golang