Mongodb mongo DB平均差

Mongodb mongo DB平均差,mongodb,average,difference,Mongodb,Average,Difference,在一些家庭作业中,我正在努力处理MongoDB查询。我对MongoDb非常陌生,到目前为止只了解基本知识。问题是: 假设我们有自2001-08-01以来的所有时间结果数据 mongo数据库集合中的各种足球比赛 结果包含以下字段开始日期,比赛id, 主队id,客场id,主队得分,客场得分 如果英格兰超级联赛的比赛id是1和球队id 如果Everton的值为5,则编写mongo查询以返回平均值 自从2005-01-01赛季埃弗顿在英格兰联赛客场比赛中进球和失球的差异 到目前为止,我有: db.res

在一些家庭作业中,我正在努力处理MongoDB查询。我对MongoDb非常陌生,到目前为止只了解基本知识。问题是:

假设我们有自2001-08-01以来的所有时间结果数据 mongo数据库集合中的各种足球比赛 结果包含以下字段开始日期比赛id主队id客场id主队得分客场得分

如果英格兰超级联赛的比赛id
1
球队id 如果Everton的值为
5
,则编写mongo查询以返回平均值 自从2005-01-01赛季埃弗顿在英格兰联赛客场比赛中进球和失球的差异

到目前为止,我有:

db.results.find( { competition_id,: 1, away_team_id: 5, kick_off_date: { $gte : new ISODate("2005-1-1T00:00:00Z") }  } )
这得到了相关数据,我相信埃弗顿自2005-01-01以来在英超的客场位置。但除了使用电子表格,我不知道如何返回得分和失球的平均差异


有人能给我指出正确的方向吗?

首先需要注意的是:和你一样,我也是mongoDB的新手,所以尽管下面给出的答案似乎有效,但可能有一种更简洁/高效的方法来实现相同的结果

以下是我构建的示例数据集:

/* 0 */
{
    "_id" : ObjectId("54d62ce0e11e084bc1366195"),
    "kick_off_date" : ISODate("2005-01-16T10:35:54.985Z"),
    "competition_id" : 1,
    "home_team_id" : 1,
    "away_team_id" : 5,
    "home_score" : 1,
    "away_score" : 3
}

/* 1 */
{
    "_id" : ObjectId("54d62cece11e084bc1366196"),
    "kick_off_date" : ISODate("2005-02-16T10:35:54.985Z"),
    "competition_id" : 1,
    "home_team_id" : 2,
    "away_team_id" : 5,
    "home_score" : 3,
    "away_score" : 1
}

/* 2 */
{
    "_id" : ObjectId("54d62cfde11e084bc1366197"),
    "kick_off_date" : ISODate("2005-03-16T10:35:54.985Z"),
    "competition_id" : 1,
    "home_team_id" : 3,
    "away_team_id" : 5,
    "home_score" : 5,
    "away_score" : 0
}

/* 3 */
{
    "_id" : ObjectId("54d62d0ce11e084bc1366198"),
    "kick_off_date" : ISODate("2005-04-16T10:35:54.985Z"),
    "competition_id" : 1,
    "home_team_id" : 4,
    "away_team_id" : 5,
    "home_score" : 0,
    "away_score" : 5
}
从这些数据可以看出,目标差异是:

    "_id" : ObjectId("54d62ce0e11e084bc1366195"),
    "difference" : -2

    "_id" : ObjectId("54d62cece11e084bc1366196"),
    "difference" : 2

    "_id" : ObjectId("54d62cfde11e084bc1366197"),
    "difference" : 5

    "_id" : ObjectId("54d62d0ce11e084bc1366198"),
    "difference" : -5
由于它们之间的负差异,只需将这些值加在一起,我们的总数将为
0
,这是没有用的。因此,查询必须考虑到这一点,并将负数视为正数,以给出总数
14
。然后平均差值为:
(14/4)=3.5

下面是一个聚合查询,它完成了所有这一切:

db.full_time_results.aggregate(
    {$match:
        {
            competition_id: 1,
            away_team_id: 5,
            kick_off_date: { $gte : ISODate("2005-01-01T00:00:00Z") }
        }
    },
    {$project:
        {
            away_team_id:1,
            difference: {$subtract:["$home_score","$away_score"]}
        }
    },
    {$group:
        {
            _id:"$away_team_id",
            avg_difference: {$avg:
                {$cond: 
                    { 
                        if: { $lt: [ "$difference", 0 ] }, 
                        then: {$multiply:["$difference", -1]}, 
                        else: "$difference" 
                    }
                }
             }
        }
    }
)
最后,结果是:

{
    "_id" : 5,
    "avg_difference" : 3.5
}

您有两个选择,一个map reduce作业或使用此处的聚合管道:非常感谢,将检查它outBrill!感谢您不厌其烦地提供如此全面的答案。我还没有解决它。现在完全有道理了!我很高兴它有用。这对我来说也是一次很好的学习经历。请你现在接受我的回答好吗。如果你愿意的话,你也可以给向上箭头一个撞击:-)是的,很高兴,但我没有足够好的声誉来撞击它或标记为答案!您确定已登录吗?据我所知,每个人都可以将自己的问题标记为已回答,然后进行投票。如果这是错误的,那么它肯定会阻碍回答世界其他地区代表的问题,这似乎不公平。是的,我已登录,但我确定我没有看到回答的箭头。但我现在知道了,并已标记为答案。然后我就可以投票表决了。