详解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往往需要重启游戏服务的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。