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

本文介绍了如何使用Node.js的MongoDB驱动程序进行数据分组和求和操作。通过`aggregate`方法,实现了根据指定字段进行分组,并对相关数值字段进行求和,例如`curr_ispasslevel`、`is_victory`和`stars`等。示例代码详细展示了分组查询的各个步骤,包括筛选、分组和计算汇总值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**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);
                  });
              });
          });
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值