mongo DB的平均差异
我在某些作业中苦于MongoDB查询。我对MongoDb非常陌生,至今只了解基础知识。这里的问题是:mongo DB的平均差异
假设我们有专职的结果数据,因为
2001-08-01
为 在蒙戈数据库收集了各种足球比赛的 结果它具有以下字段kick_off_date,competition_id , home_team_id,away_team_id,home_score,away_score。如果competition_id英超的是
1
和TEAM_ID埃弗顿的 是5
,写蒙戈查询,将在>英语返回因为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的新手,尽管下面给出的答案似乎有效,但可能会有更简洁/高效的方法来达到相同的结果。
这里是样本数据集I构成:
/* 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
}
布里尔!感谢您煞费苦心提供了这样一个全面的答案。我仍然没有解决它。它现在完全合理! – 2015-02-08 22:59:19
我很高兴它有用。对我来说这也是一次很好的学习经历。现在请你接受我的答案。如果你喜欢的话,你总是可以给上箭头一个凹凸:-) – biofractal 2015-02-09 09:11:47
是的,很高兴,但我没有足够好的声望来将它撞上或标记为答案! – 2015-02-10 09:39:08
你有2个选择,一个MAP-减少工作或使用聚合管道:http://docs.mongodb.org/manual/tutorial/aggregation-zip-code-data-set/ – reptilicus 2015-02-05 22:37:42
非常感谢,将检查出来 – 2015-02-06 15:37:51