详解nodejs操作mongodb数据库封装DB类


Posted in NodeJs onApril 10, 2017

这个DB类也算是我经历了3个实际项目应用的,现分享出来,有需要的请借鉴批评。

上面的注释都挺详细的,我使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的。

关于mongoose的安装就是 npm install -g mongoose

这个DB类的数据库配置是基于auth认证的,如果您的数据库没有账号与密码则留空即可。

/**
 * mongoose操作类(封装mongodb)
 */

var fs = require('fs');
var path = require('path');
var mongoose = require('mongoose');
var logger = require('pomelo-logger').getLogger('mongodb-log');

var options = {
  db_user: "game",
  db_pwd: "12345678",
  db_host: "192.168.2.20",
  db_port: 27017,
  db_name: "dbname"
};

var dbURL = "mongodb://" + options.db_user + ":" + options.db_pwd + "@" + options.db_host + ":" + options.db_port + "/" + options.db_name;
mongoose.connect(dbURL);

mongoose.connection.on('connected', function (err) {
  if (err) logger.error('Database connection failure');
});

mongoose.connection.on('error', function (err) {
  logger.error('Mongoose connected error ' + err);
});

mongoose.connection.on('disconnected', function () {
  logger.error('Mongoose disconnected');
});

process.on('SIGINT', function () {
  mongoose.connection.close(function () {
    logger.info('Mongoose disconnected through app termination');
    process.exit(0);
  });
});

var DB = function () {
  this.mongoClient = {};
  var filename = path.join(path.dirname(__dirname).replace('app', ''), 'config/table.json');
  this.tabConf = JSON.parse(fs.readFileSync(path.normalize(filename)));
};

/**
 * 初始化mongoose model
 * @param table_name 表名称(集合名称)
 */
DB.prototype.getConnection = function (table_name) {
  if (!table_name) return;
  if (!this.tabConf[table_name]) {
    logger.error('No table structure');
    return false;
  }

  var client = this.mongoClient[table_name];
  if (!client) {
    //构建用户信息表结构
    var nodeSchema = new mongoose.Schema(this.tabConf[table_name]);

    //构建model
    client = mongoose.model(table_name, nodeSchema, table_name);

    this.mongoClient[table_name] = client;
  }
  return client;
};

/**
 * 保存数据
 * @param table_name 表名
 * @param fields 表数据
 * @param callback 回调方法
 */
DB.prototype.save = function (table_name, fields, callback) {
  if (!fields) {
    if (callback) callback({msg: 'Field is not allowed for null'});
    return false;
  }

  var err_num = 0;
  for (var i in fields) {
    if (!this.tabConf[table_name][i]) err_num ++;
  }
  if (err_num > 0) {
    if (callback) callback({msg: 'Wrong field name'});
    return false;
  }

  var node_model = this.getConnection(table_name);
  var mongooseEntity = new node_model(fields);
  mongooseEntity.save(function (err, res) {
    if (err) {
      if (callback) callback(err);
    } else {
      if (callback) callback(null, res);
    }
  });
};

/**
 * 更新数据
 * @param table_name 表名
 * @param conditions 更新需要的条件 {_id: id, user_name: name}
 * @param update_fields 要更新的字段 {age: 21, sex: 1}
 * @param callback 回调方法
 */
DB.prototype.update = function (table_name, conditions, update_fields, callback) {
  if (!update_fields || !conditions) {
    if (callback) callback({msg: 'Parameter error'});
    return;
  }
  var node_model = this.getConnection(table_name);
  node_model.update(conditions, {$set: update_fields}, {multi: true, upsert: true}, function (err, res) {
    if (err) {
      if (callback) callback(err);
    } else {
      if (callback) callback(null, res);
    }
  });
};

/**
 * 更新数据方法(带操作符的)
 * @param table_name 数据表名
 * @param conditions 更新条件 {_id: id, user_name: name}
 * @param update_fields 更新的操作符 {$set: {id: 123}}
 * @param callback 回调方法
 */
DB.prototype.updateData = function (table_name, conditions, update_fields, callback) {
  if (!update_fields || !conditions) {
    if (callback) callback({msg: 'Parameter error'});
    return;
  }
  var node_model = this.getConnection(table_name);
  node_model.findOneAndUpdate(conditions, update_fields, {multi: true, upsert: true}, function (err, data) {
    if (callback) callback(err, data);
  });
};

/**
 * 删除数据
 * @param table_name 表名
 * @param conditions 删除需要的条件 {_id: id}
 * @param callback 回调方法
 */
DB.prototype.remove = function (table_name, conditions, callback) {
  var node_model = this.getConnection(table_name);
  node_model.remove(conditions, function (err, res) {
    if (err) {
      if (callback) callback(err);
    } else {
      if (callback) callback(null, res);
    }
  });
};

/**
 * 查询数据
 * @param table_name 表名
 * @param conditions 查询条件
 * @param fields 待返回字段
 * @param callback 回调方法
 */
DB.prototype.find = function (table_name, conditions, fields, callback) {
  var node_model = this.getConnection(table_name);
  node_model.find(conditions, fields || null, {}, function (err, res) {
    if (err) {
      callback(err);
    } else {
      callback(null, res);
    }
  });
};

/**
 * 查询单条数据
 * @param table_name 表名
 * @param conditions 查询条件
 * @param callback 回调方法
 */
DB.prototype.findOne = function (table_name, conditions, callback) {
  var node_model = this.getConnection(table_name);
  node_model.findOne(conditions, function (err, res) {
    if (err) {
      callback(err);
    } else {
      callback(null, res);
    }
  });
};

/**
 * 根据_id查询指定的数据
 * @param table_name 表名
 * @param _id 可以是字符串或 ObjectId 对象。
 * @param callback 回调方法
 */
DB.prototype.findById = function (table_name, _id, callback) {
  var node_model = this.getConnection(table_name);
  node_model.findById(_id, function (err, res){
    if (err) {
      callback(err);
    } else {
      callback(null, res);
    }
  });
};

/**
 * 返回符合条件的文档数
 * @param table_name 表名
 * @param conditions 查询条件
 * @param callback 回调方法
 */
DB.prototype.count = function (table_name, conditions, callback) {
  var node_model = this.getConnection(table_name);
  node_model.count(conditions, function (err, res) {
    if (err) {
      callback(err);
    } else {
      callback(null, res);
    }
  });
};

/**
 * 查询符合条件的文档并返回根据键分组的结果
 * @param table_name 表名
 * @param field 待返回的键值
 * @param conditions 查询条件
 * @param callback 回调方法
 */
DB.prototype.distinct = function (table_name, field, conditions, callback) {
  var node_model = this.getConnection(table_name);
  node_model.distinct(field, conditions, function (err, res) {
    if (err) {
      callback(err);
    } else {
      callback(null, res);
    }
  });
};

/**
 * 连写查询
 * @param table_name 表名
 * @param conditions 查询条件 {a:1, b:2}
 * @param options 选项:{fields: "a b c", sort: {time: -1}, limit: 10}
 * @param callback 回调方法
 */
DB.prototype.where = function (table_name, conditions, options, callback) {
  var node_model = this.getConnection(table_name);
  node_model.find(conditions)
    .select(options.fields || '')
    .sort(options.sort || {})
    .limit(options.limit || {})
    .exec(function (err, res) {
      if (err) {
        callback(err);
      } else {
        callback(null, res);
      }
    });
};

module.exports = new DB();

这个类库使用方法如下:

//先包含进来
var MongoDB = require('./mongodb');

//查询一条数据
MongoDB.findOne('user_info', {_id: user_id}, function (err, res) {
  console.log(res);
});

//查询多条数据
MongoDB.find('user_info', {type: 1}, {}, function (err, res) {
  console.log(res);
});

//更新数据并返回结果集合
MongoDB.updateData('user_info', {_id: user_info._id}, {$set: update_data}, function(err, user_info) {
   callback(null, user_info);
});

//删除数据
MongoDB.remove('user_data', {user_id: 1});

就先举这些例子,更多的可亲自尝试吧!

其中配置中的 config/table.json 是数据库集合的配置项,结构如下:

{
"user_stats_data": {
    "user_id": "Number",
    "platform": "Number",
    "user_first_time": "Number",
    "create_time": "Number"
  },
  "room_data": {
    "room_id": "String",
    "room_type": "Number",
    "user_id": "Number",
    "player_num": "Number",
    "diamond_num": "Number",
    "normal_settle": "Number",
    "single_settle": "Number",
    "create_time": "Number"
  },
  "online_data": {
    "server_id": "String",
    "pf": "Number",
    "player_num": "Number",
    "room_list": "String",
    "update_time": "Number"
  }
}

记得每次给添加字段时,要往这个table.json里面添加。由于nodejs这个服务器的改动,更改table.json往往需要重启游戏服务的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
使用nodejs开发cli项目实例
Jun 03 NodeJs
NodeJs——入门必看攻略
Jun 27 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
详解nodejs中exports和module.exports的区别
Feb 17 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
nodeJS进程管理器pm2的使用
Jan 09 NodeJs
Nodejs实现的操作MongoDB数据库功能完整示例
Feb 02 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
详解nodejs微信公众号开发——3.封装消息响应模块
Apr 10 #NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 #NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 #NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 #NodeJs
初识NodeJS服务端开发入门(Express+MySQL)
Apr 07 #NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 #NodeJs
nodejs爬虫遇到的乱码问题汇总
Apr 07 #NodeJs
You might like
比较详细PHP生成静态页面教程
2012/01/10 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php自定义时间转换函数示例
2016/12/07 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
JsRender实用入门教程
2014/10/31 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
Python 字符串大小写转换的简单实例
2017/01/21 Python
python tkinter界面居中显示的方法
2018/10/11 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
html5教程画矩形代码分享
2013/12/04 HTML / CSS
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
教师评优事迹材料
2014/01/10 职场文书
设计师个人求职信范文
2014/02/02 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
师范大学生求职信
2014/06/13 职场文书
大学生实习证明范本
2014/09/19 职场文书
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android
python绘制云雨图raincloud plot
2022/08/05 Python