您的位置:首页 > 数据库 > Mongodb

ndoejs+mongodb 开发1:aggregate 分组求和

2017-08-21 11:18 369 查看
/**auother : zhz
* mongodb :分组求和
* array:
*      控制的显示列$project,筛选条件 $match ,排序 $sort,分组key $group:_id ,求和值  $sum($max,$avg,$min等)
* */
HelperMongo.prototype.mGgruopAndsum = function(collectionName, array,callback) {
var self = this;
var reqId = _reqId++;
_log(reqId,"开始查找数量... "+collectionName+","+JSON.stringify(array));
function process(callback) {
_getCollection(self, collectionName, function (collection) {
collection.aggregate(array,function(error,rst){
if (error) {
global.err(collectionName + " : " + JSON.stringify(error));
return;
}
_log(reqId, "查找成功--> " + JSON.stringify(rst));
if(callback != undefined) callback(rst);
});

});
}
return _judgePromise(process,callback);
};
function _judgePromise(process,callback){
if(callback==undefined){
return new global.Promise(function(resolve, reject) {
process(resolve);
});
}else{
process(callback);
}
}

//获得排名信息
function _get_rank_list(callback){
constructcommon_exports._get_curr_constructid(function(res) {
constructid  = res.constructid;

app.mgCross.mGgruopAndsum(playerRecord.NAME,[
{ $project : {              //供使用的列
constructid   : 1,
self_gpid     : 1,
is_victory    : 1,
stars         : 1,
remain_time   : 1,
end_time      : 1,
curr_ispasslevel   : 1,
curr_match : 1
}
},
{ $match : {                //筛选条件
constructid    : constructid
// is_victory     : {"$ne":-1} //没结算的战斗不计入排行
}
},
{ $group : {
_id               : { self_gpid:"$self_gpid",curr_match:"$curr_match"}, //分组"$self_gpid"
curr_levelcounts  : { $sum : "$curr_ispasslevel" }, //运算
is_victory        : { $sum : "$is_victory" },
stars             : { $sum : "$stars" },
remain_time       : { $sum : "$remain_time" },
end_time          : { $max : "$end_time"}
}
}
],function(recordlist){

if(recordlist.length == 0){
var msg = {};
msg.rankinfo ={};
console.error("没有排行榜数据");
send(msg);
}

var lable = exUtil.timeUnix();
var array = [];
for(var i = 0;i<recordlist.length;i++){
var doc = {};
var tar_gpid_temp = recordlist[i]._id["self_gpid"];
var tar_gpsid = tar_gpid_temp.split("-");
var tar_gsid  = tar_gpsid[0];
var tar_pid   = tar_gpsid[1];
doc.constructid = constructid;
doc.gsid      = tar_gsid;
doc.pid       = tar_pid;
doc.curr_rank = lable;
doc.level     = (recordlist[i].curr_levelcounts) / 3 ;
doc.victory   = recordlist[i].is_victory;
doc.star      = recordlist[i].stars;
doc.fighttime = recordlist[i].remain_time;
doc.overtime  = recordlist[i].end_time;
doc.rankingAwards = "";
doc.isGetRankingAwards = 0;
array.push(doc);
}
app.mgCross.mgInsert(trank.NAME,array,function(res){ //批量插入
callback(constructid,lable);
});
});
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongodb nodejs