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实现的鼠标经过时播放声音
May 18 Javascript
返回对象在当前级别中是第几个元素的实现代码
Jan 20 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
Mar 03 Javascript
自己动手开发jQuery插件教程
Aug 25 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
Aug 30 Javascript
通过JS来动态的修改url,实现对url的增删查改
Sep 01 Javascript
JavaScript数组的栈方法与队列方法详解
May 26 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
Jun 14 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
Dec 26 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
Jan 03 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
Jan 11 Javascript
vue路由插件之vue-route
Jun 13 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录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
javascript中[]和{}对象使用介绍
2013/03/20 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
详解react-redux插件入门
2018/04/19 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
用Python输出一个杨辉三角的例子
2014/06/13 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
html5读取本地文件示例代码
2014/04/22 HTML / CSS
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
俄罗斯游戏商店:Buka
2020/03/01 全球购物
一套C#面试题
2013/10/09 面试题
应届毕业生就业自荐信
2013/10/26 职场文书
趣味比赛活动方案
2014/02/15 职场文书
战略合作意向书范本
2014/04/01 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
Hive常用日期格式转换语法
2022/06/25 数据库