详解nodejs操作mongodb数据库封装DB类
这个DB类也算是我经历了3个实际项目应用的,现分享出来,有需要的请借鉴批评。
上面的注释都挺详细的,我使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的。
关于mongoose的安装就是npminstall-gmongoose
这个DB类的数据库配置是基于auth认证的,如果您的数据库没有账号与密码则留空即可。
/** *mongoose操作类(封装mongodb) */ varfs=require('fs'); varpath=require('path'); varmongoose=require('mongoose'); varlogger=require('pomelo-logger').getLogger('mongodb-log'); varoptions={ db_user:"game", db_pwd:"12345678", db_host:"192.168.2.20", db_port:27017, db_name:"dbname" }; vardbURL="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('Databaseconnectionfailure'); }); mongoose.connection.on('error',function(err){ logger.error('Mongooseconnectederror'+err); }); mongoose.connection.on('disconnected',function(){ logger.error('Mongoosedisconnected'); }); process.on('SIGINT',function(){ mongoose.connection.close(function(){ logger.info('Mongoosedisconnectedthroughapptermination'); process.exit(0); }); }); varDB=function(){ this.mongoClient={}; varfilename=path.join(path.dirname(__dirname).replace('app',''),'config/table.json'); this.tabConf=JSON.parse(fs.readFileSync(path.normalize(filename))); }; /** *初始化mongoosemodel *@paramtable_name表名称(集合名称) */ DB.prototype.getConnection=function(table_name){ if(!table_name)return; if(!this.tabConf[table_name]){ logger.error('Notablestructure'); returnfalse; } varclient=this.mongoClient[table_name]; if(!client){ //构建用户信息表结构 varnodeSchema=newmongoose.Schema(this.tabConf[table_name]); //构建model client=mongoose.model(table_name,nodeSchema,table_name); this.mongoClient[table_name]=client; } returnclient; }; /** *保存数据 *@paramtable_name表名 *@paramfields表数据 *@paramcallback回调方法 */ DB.prototype.save=function(table_name,fields,callback){ if(!fields){ if(callback)callback({msg:'Fieldisnotallowedfornull'}); returnfalse; } varerr_num=0; for(variinfields){ if(!this.tabConf[table_name][i])err_num++; } if(err_num>0){ if(callback)callback({msg:'Wrongfieldname'}); returnfalse; } varnode_model=this.getConnection(table_name); varmongooseEntity=newnode_model(fields); mongooseEntity.save(function(err,res){ if(err){ if(callback)callback(err); }else{ if(callback)callback(null,res); } }); }; /** *更新数据 *@paramtable_name表名 *@paramconditions更新需要的条件{_id:id,user_name:name} *@paramupdate_fields要更新的字段{age:21,sex:1} *@paramcallback回调方法 */ DB.prototype.update=function(table_name,conditions,update_fields,callback){ if(!update_fields||!conditions){ if(callback)callback({msg:'Parametererror'}); return; } varnode_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); } }); }; /** *更新数据方法(带操作符的) *@paramtable_name数据表名 *@paramconditions更新条件{_id:id,user_name:name} *@paramupdate_fields更新的操作符{$set:{id:123}} *@paramcallback回调方法 */ DB.prototype.updateData=function(table_name,conditions,update_fields,callback){ if(!update_fields||!conditions){ if(callback)callback({msg:'Parametererror'}); return; } varnode_model=this.getConnection(table_name); node_model.findOneAndUpdate(conditions,update_fields,{multi:true,upsert:true},function(err,data){ if(callback)callback(err,data); }); }; /** *删除数据 *@paramtable_name表名 *@paramconditions删除需要的条件{_id:id} *@paramcallback回调方法 */ DB.prototype.remove=function(table_name,conditions,callback){ varnode_model=this.getConnection(table_name); node_model.remove(conditions,function(err,res){ if(err){ if(callback)callback(err); }else{ if(callback)callback(null,res); } }); }; /** *查询数据 *@paramtable_name表名 *@paramconditions查询条件 *@paramfields待返回字段 *@paramcallback回调方法 */ DB.prototype.find=function(table_name,conditions,fields,callback){ varnode_model=this.getConnection(table_name); node_model.find(conditions,fields||null,{},function(err,res){ if(err){ callback(err); }else{ callback(null,res); } }); }; /** *查询单条数据 *@paramtable_name表名 *@paramconditions查询条件 *@paramcallback回调方法 */ DB.prototype.findOne=function(table_name,conditions,callback){ varnode_model=this.getConnection(table_name); node_model.findOne(conditions,function(err,res){ if(err){ callback(err); }else{ callback(null,res); } }); }; /** *根据_id查询指定的数据 *@paramtable_name表名 *@param_id可以是字符串或ObjectId对象。 *@paramcallback回调方法 */ DB.prototype.findById=function(table_name,_id,callback){ varnode_model=this.getConnection(table_name); node_model.findById(_id,function(err,res){ if(err){ callback(err); }else{ callback(null,res); } }); }; /** *返回符合条件的文档数 *@paramtable_name表名 *@paramconditions查询条件 *@paramcallback回调方法 */ DB.prototype.count=function(table_name,conditions,callback){ varnode_model=this.getConnection(table_name); node_model.count(conditions,function(err,res){ if(err){ callback(err); }else{ callback(null,res); } }); }; /** *查询符合条件的文档并返回根据键分组的结果 *@paramtable_name表名 *@paramfield待返回的键值 *@paramconditions查询条件 *@paramcallback回调方法 */ DB.prototype.distinct=function(table_name,field,conditions,callback){ varnode_model=this.getConnection(table_name); node_model.distinct(field,conditions,function(err,res){ if(err){ callback(err); }else{ callback(null,res); } }); }; /** *连写查询 *@paramtable_name表名 *@paramconditions查询条件{a:1,b:2} *@paramoptions选项:{fields:"abc",sort:{time:-1},limit:10} *@paramcallback回调方法 */ DB.prototype.where=function(table_name,conditions,options,callback){ varnode_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=newDB();
这个类库使用方法如下:
//先包含进来 varMongoDB=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往往需要重启游戏服务的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。