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

来源:互联网 发布:阿里云香港节点ip 编辑:程序博客网 时间:2024/05/20 10:21
/**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);                  });              });          });    }


原创粉丝点击