mongoDB的平均差异

时间:2015-02-05 20:58:54

标签: mongodb average difference

我在一些家庭作业中苦苦寻求MongoDB查询。我是MongoDb的新手,到目前为止只了解基础知识。这是一个问题:

  

假设我们拥有自2001-08-01以来的全职结果数据   mongo数据库集合中的各种足球比赛   结果,其中包含以下字段 kick_off_date competition_id ,    home_team_id away_team_id home_score away_score

     

如果英超联赛的 competition_id 1 team_id   埃弗顿的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以来埃弗顿离开英超联赛的相关数据。但是我不知道如何处理回归的目标平均差异和失败的目标,而不是使用电子表格。

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

1 个答案:

答案 0 :(得分:2)

首先需要注意的是:像你一样,我是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
}