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作用域和作用域链
Oct 21 Javascript
Javascript 页面模板化很多人没有使用过的方法
Jun 05 Javascript
js遍历td tr等html元素
Dec 13 Javascript
JavaScript中Function详解
Feb 27 Javascript
关于JS中prototype的理解
Sep 07 Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
Apr 05 Javascript
js定义类的几种方法(推荐)
Jun 08 Javascript
基于JSON数据格式详解
Aug 31 Javascript
vue实现通讯录功能
Jul 14 Javascript
Vue+axios实现统一接口管理的方法
Jul 23 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 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+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
解决FLASH需要点击激活的代码
2006/12/20 Javascript
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
Prototype框架详解
2015/11/25 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
介绍Python中的一些高级编程技巧
2015/04/02 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
美国在线家装零售商:Build.com
2016/09/02 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
opencv实现图像几何变换
2021/03/24 Python
实习老师个人总结的自我评价
2013/09/28 职场文书
厨房管理计划书
2014/04/27 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
Python echarts实现数据可视化实例详解
2022/03/03 Python