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 相关文章推荐
js实现幻灯片效果(基于jquery插件)
Nov 05 Javascript
JS常用正则表达式总结
Nov 12 Javascript
探讨javascript是不是面向对象的语言
Nov 21 Javascript
使用控制台破解百小度一个月只准改一次名字
Aug 13 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
Mar 14 Javascript
ES6中class类用法实例浅析
Apr 06 Javascript
Vue开发中整合axios的文件整理
Apr 29 Javascript
详解Angular4中路由Router类的跳转navigate
Jun 09 Javascript
JS判断微信扫码的方法
Aug 07 Javascript
判断div滑动到底部的scroll实例代码
Nov 15 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
Aug 22 Javascript
浅谈Fetch 数据交互方式
Dec 20 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中使用Oracle数据库(2)
2006/10/09 PHP
php采集速度探究总结(原创)
2008/04/18 PHP
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
2014/11/22 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
json 入门基础教程 推荐
2009/10/31 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
微信小程序实现循环动画效果
2018/07/16 Javascript
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
使用python+whoosh实现全文检索
2019/12/09 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
python3 re返回形式总结
2020/11/20 Python
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
数学专业毕业生自荐信
2013/11/10 职场文书
批评与自我批评总结
2014/10/17 职场文书
化验员岗位职责
2015/02/14 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL