【问题标题】:Custom math with aggregation using mongo and angular使用 mongo 和 angular 进行聚合的自定义数学
【发布时间】:2017-09-07 13:01:25
【问题描述】:

我目前正在使用聚合来显示统计页面的注册团队和网络。我可以在每个级别上进行计数,但是网络的计算不准确。我的汇总如下:

module.exports.registrationStats = function(req, res) {
  Registration.aggregate([
    {
        "$group": {
            "_id": { 
                "day": "$day", 
                "group": "$group",
                "division": "$division",
                "level": "$level"
            },
            "count": { "$sum": 1 }
        }
    },
    {
        "$group": {
            "_id": { 
                "day": "$_id.day", 
                "group": "$_id.group",
                "division": "$_id.division"                
            },
            "count": { "$sum": "$count" },
            "levels": {
                "$push": {
                    "level": "$_id.level",
                    "teams": "$count",
                    "nets" : {$ceil : { $divide: [ "$count" , 5 ] } }
                }
            }
        }
    },
    {
        "$group": {
            "_id": { 
                "day": "$_id.day", 
                "group": "$_id.group"             
            },
            "count": { "$sum": "$count" },
            "divisions": {
                "$push": {
                    "division": "$_id.division",
                    "count": "$count",
                    "levels": "$levels"
                }
            }
        }
    }
]).exec(function(err, regStats){
    if(err) {
      console.log("Error grouping registrations");
      res.status(500).json(err);
    } else {
      console.log("Found and grouped " + regStats.length + " regStats");
      res.json(regStats);
    }
  });
};

这给了我以下输出:

[
    {
        "_id": {
            "day": "Saturday",
            "group": "nonpro"
        },
        "count": 144,
        "divisions": [
            {
                "division": "Men's",
                "count": 69,
                "levels": [
                    {
                        "level": "BB",
                        "teams": 30,
                        "nets": 6
                    },
                    {
                        "level": "A",
                        "teams": 8,
                        "nets": 2
                    },
                    {
                        "level": "B",
                        "teams": 19,
                        "nets": 4
                    },
                    {
                        "level": "AA",
                        "teams": 12,
                        "nets": 3
                    }
                ]
            },
            {
                "division": "Women's",
                "count": 75,
                "levels": [
                    {
                        "level": "AA",
                        "teams": 9,
                        "nets": 2
                    },
                    {
                        "level": "BB",
                        "teams": 16,
                        "nets": 4
                    },
                    {
                        "level": "B",
                        "teams": 18,
                        "nets": 4
                    },
                    {
                        "level": "A",
                        "teams": 32,
                        "nets": 7
                    }
                ]
            }
        ]
    }
]

问题是我不能只在 Math.ceil(divisions.count/5) 上运行 ceil 过滤器来获取 Divisions.nets 或 Math.ceil(_id.count/5) 的值来获取 _id.nets因为在某些情况下它们是错误的。

我需要能够总计 divisions.levels.nets 并将其推送到 divisions.nets 并添加 partitions.nets 并将该值放入 _id.nets 以便计算正常工作。

关于如何做到这一点的任何想法?

【问题讨论】:

    标签: angularjs mongodb mongoose


    【解决方案1】:

    类似的东西。添加$project 阶段以计算netslevel 后跟$sum$push nets 其余$groups

    Registration.aggregate([
        {
            "$group": {
                "_id": { 
                    "day": "$day", 
                    "group": "$group",
                    "division": "$division",
                    "level": "$level"
                },
                "count": { "$sum": 1 }
            }
        },
        { $project: { count:1,  nets: { $ceil : { $divide: [ "$count" , 5 ] } } } },
        {
            "$group": {
                "_id": { 
                    "day": "$_id.day", 
                    "group": "$_id.group",
                    "division": "$_id.division"                
                },
                "count": { "$sum": "$count" },
                "nets": { "$sum": "$nets" },
                "levels": {
                    "$push": {
                        "level": "$_id.level",
                        "teams": "$count",
                        "nets" : "$nets"
                    }
                }
            }
        },
        {
            "$group": {
                "_id": { 
                    "day": "$_id.day", 
                    "group": "$_id.group"             
                },
                "count": { "$sum": "$count" },
                "nets": { "$sum": "$nets" },
                "divisions": {
                    "$push": {
                        "division": "$_id.division",
                        "count": "$count",
                        "nets:": "$nets",
                        "levels": "$levels"
                    }
                }
            }
        }
    ])
    

    【讨论】:

    • 好的,太棒了!因此,项目允许我从第一个分组中获取一些东西并在第二部分中使用它。然后我可以“投影”或将其放入其他级别的分组中?我所看到的关于聚合的所有内容似乎都是指 unix 或我不知道的东西,所以我有点迷茫。
    • 您可以使用$project/$addFields在每个文档上添加附加/覆盖字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2019-10-14
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多