首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoChef聚合:在一个查询中查找并显示最大3、2和1‘项目月’分组数据的平均得分

MongoChef聚合:在一个查询中查找并显示最大3、2和1‘项目月’分组数据的平均得分
EN

Stack Overflow用户
提问于 2016-09-02 13:49:25
回答 2查看 585关注 0票数 2

如果您有以下数据,则使用MongoChef聚合:

代码语言:javascript
复制
{_id: 1, Mnt: 2016-05-01, Score: 85}
{_id: 2, Mnt: 2016-05-01, Score: 85}
{_id: 3, Mnt: 2016-03-01, Score: 80}
{_id: 4, Mnt: 2016-03-01, Score: 80}
{_id: 5, Mnt: 2016-03-01, Score: 80}
{_id: 6, Mnt: 2016-01-01, Score: 75}

并希望:

  1. 计算集合中的最大月份(即M1 :2016年5月),
  2. 按"Mnt“分类-这可能不是连续的最近几个月,例如最近/最大的3个月以上的收款:2016-5月-2016年3月-2016年1月,
  3. 找到最新的X个月总数,
  4. 算出每个人的平均数,

例如:

代码语言:javascript
复制
{M1 : 85, M2 : 82, M3 : 80.8}

也就是说,M1是收集中最大月的平均值,M2是收集中最大2个项目月的平均值,M3是收集中最大3个项目月的平均值,等等。

EN

回答 2

Stack Overflow用户

发布于 2016-09-02 16:24:19

这是一个肮脏的解决方案,但将概述如何开始:

代码语言:javascript
复制
var i = 1;
var elemSum = 0;
var elemCount = 0;

db.a.aggregate([{
            $group : {
                _id : {
                    year : {
                        $year : "$Mnt"
                    },
                    month : {
                        $month : "$Mnt"
                    }
                },
                avg : {
                    $avg : "$Score"
                },

                elemCount : {
                    $sum : 1
                },
                elemSum : {
                    $sum : "$Score"
                }
            }
        }, {
            $sort : {
                "_id.year" : -1,
                "_id.month" : -1
            }
        },
        {
            $limit : 3
        }, // first 3 records


    ]).forEach(function (doc) {

    elemSum += doc.elemSum;
    elemCount += doc.elemCount;
    var result = elemSum / elemCount;
    var x = "M" + i.toString() + ": ";
    print(x + result.toString());
    i++;

})

我将月份字段转换为iso time

代码语言:javascript
复制
db.a.insert([
{_id: 1, Mnt: new ISODate("2016-05-01T15:44:00.255Z"), Score: 85},
{_id: 2, Mnt: new ISODate("2016-05-01T15:44:00.255Z"), Score: 85},
{_id: 3, Mnt: new ISODate("2016-03-01T15:44:00.255Z"), Score: 80},
{_id: 4, Mnt: new ISODate("2016-03-01T15:44:00.255Z"), Score: 80},
{_id: 5, Mnt: new ISODate("2016-03-01T15:44:00.255Z"), Score: 80},
{_id: 6, Mnt: new ISODate("2016-01-01T15:44:00.255Z"), Score: 75}

])
票数 0
EN

Stack Overflow用户

发布于 2016-09-03 20:19:23

工作代码-计算运行12个月和当前月份的净启动程序分数:

代码语言:javascript
复制
   db.Collection.aggregate(

// Pipeline
  // Stage 1
{
  $project: {
        ID: "$ID",
             Mnt: "$Mnt",
             CntryReg: "$CntryReg",
             Prom: "$Prom",
  }
},

// Stage 2
{
  $group: {
            _id: '$Mnt',
            docs: {
                $push: {
                    Mnt: "$Mnt",
                    CntryReg: "$CntryReg",
                    Prom: "$Prom"
                }}

  }
},

// Stage 3
{
  $sort: {
      _id: -1
  }
},

// Stage 4
{
  $limit: 12
},

// Stage 5
{
  $group: {
         "_id": null,
         "values": { "$push": "$docs" } 

  }
},

// Stage 6
{
  $unwind: {
    "path": "$values", "includeArrayIndex": "rank"  
  }
},

// Stage 7
{
  $unwind: "$values"
},

// Stage 8
{
  $project: {
      _id: 0,
         Mnt: "$values.Mnt",
         CntryReg: "$values.CntryReg",
         Prom: "$values.Prom",
         rank: "$rank"

  }
},

// Stage 9
{
  $group: {
          _id: {CntryReg:"$CntryReg"} ,

          AR12: { $sum: { $cond :  [{ $eq : ["$Prom", "D"]}, 1, 0]} },
          Ind12: { $sum: { $cond :  [{ $eq : ["$Prom", "I"]}, 1, 0]} },
          Loy12: { $sum: { $cond :  [{ $eq : ["$Prom", "P"]}, 1, 0]} },
          Sum12: {$sum: 1 },

          AR1: { $sum: { $cond :  [{ $and : [{  $eq : ["$Prom", "D"]} ,  {$eq : ["$rank", 0]} ]}, 1, 0]} },   
          Loy1: { $sum: { $cond :  [{ $and : [{  $eq : ["$Prom", "P"]} , {$eq : ["$rank", 0]} ]}, 1, 0]} },
          Ind1: { $sum: { $cond :  [{ $and : [{  $eq : ["$Prom", "I"]} , {$eq : ["$rank", 0]} ]}, 1, 0]} },
          Sum1: { $sum: { $cond :  [ {  $eq : ["$rank", 0]}, 1, 0]} },
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39294041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档