MongoDB 2.4 - 按日期划分的聚合组,间隔为120天

时间:2018-05-06 21:04:24

标签: mongodb date intervals aggregation

我希望有人能帮我解决实际问题。我使用MongoDB工作了2个月,过去我只使用SQL数据库,这就是为什么在mongoDB中思考并不容易。

我已经看过论坛中的几个例子,但我无法使它适应我的问题。

我有很多游戏玩家和游戏结果。

该集合如下:

> db.gameresults.find({"player": 6805}).pretty()
{
"_id" : ObjectId("c5b037807ab6cc37951a0000"),
"player" : 6805,
"birthdate" : ISODate("1999-01-01T00:00:00Z"),
"gender" : "m",
"race" : "ASIAN",
"playedgames" : [
    {
        "vGameName" : "GameA",
        "highscore" : 36.20000076293945,
        "hsDate" : ISODate("2015-07-20T01:01:00Z"),
    },
    {
        "vGameName" : "GameA",
        "highscore" : 13,
        "hsDate" : ISODate("2015-08-03T01:02:00Z"),
    },
    {
        "vGameName" : "GameB",
        "highscore" : 55,
        "hsDate" : ISODate("2015-08-03T01:01:00Z"),
    },
    {
        "vGameName" : "GameC",
        "highscore" : 104,
        "hsDate" : ISODate("2015-11-08T09:30:00Z"),
    },
    {
        "vGameName" : "GameA",
        "highscore" : 81,
        "hsDate" : ISODate("2015-06-03T11:04:00Z"),
    },
    {
        "vGameName" : "GameC",
        "highscore" : 21,
        "hsDate" : ISODate("2016-12-03T11:04:00Z"),
    },
    {
        "vGameName" : "GameB",
        "highscore" : 7.170000076293945,
        "hsDate" : ISODate("2016-09-08T09:30:00Z"),
    }
]

}

现在我尝试在我的集合上创建一个聚合,以获得一个显示以下内容的结果:

120天时间范围内的平均高分,从玩家排序的最小日期开始。

结果看起来应该是这样,但在120天之内:

{ "_id" : { "player" : 6805, "hsDate" : ISODate("2015-06-03T00:00:00Z") }, "avgHighscore" : 51 }
{ "_id" : { "player" : 6805, "hsDate" : ISODate("2015-06-07T00:00:00Z") }, "avgHighscore" : 9.520000457763672 }
{ "_id" : { "player" : 6805, "hsDate" : ISODate("2015-06-08T00:00:00Z") }, "avgHighscore" : 60.50477317381989 }
{ "_id" : { "player" : 6805, "hsDate" : ISODate("2015-06-10T00:00:00Z") }, "avgHighscore" : 5.766666730244954 }
{ "_id" : { "player" : 6805, "hsDate" : ISODate("2016-06-14T00:00:00Z") }, "avgHighscore" : 9.5600004196167 }
{ "_id" : { "player" : 6805, "hsDate" : ISODate("2016-06-15T00:00:00Z") }, "avgHighscore" : 57.574060224220155 }

120天后的结果,应该以新的间隔开始。 我现在尝试了一个多星期才弄清楚如何解决这个问题,但我找到的唯一方法是每天一次,我无法将其改善为120天。

此外,我试图在此论坛中使用类似解决方案中的建议,分钟,秒或小时。但是我无法将它们改为与我的120天间隔一起工作。

旧MySQL数据如下所示:

player    highscore   hsDate
6805      81          2015-06-03 12:04:00
6805      21          2015-06-03 12:04:00
6805      9.52        2015-06-07 21:00:00
6805      104         2015-06-08 10:30:00
6805      7.17        2015-06-08 10:30:00
6805      2.54        2015-06-08 10:30:00
6805      8.2         2015-06-08 10:30:00
6805      25.5        2015-06-08 10:30:00

我的代码间隔1天正在考虑:

db.gameresults.aggregate(
        { $unwind : "$playedgames" },
        { "$project" : { "player" : 1, "playedgames" : 1, "date" : '$playedgames.hsDate', "_id" : 0, "day" : { "$dayOfMonth" : '$playedgames.hsDate' }, "h" : { "$hour" : '$playedgames.hsDate' }, "m" : { "$minute" : '$playedgames.hsDate' }, "s" : { "$second" : '$playedgames.hsDate' }, "ml" : { "$millisecond" : '$playedgames.hsDate' } } },
        { "$project" : { "player" : 1, "playedgames" : 1, "date" : { "$subtract" : [ "$date", { "$add" : [ "$ml", { "$multiply" : [ "$s", 1000 ] }, { "$multiply" : [ "$m", 60, 1000 ] }, { "$multiply" : [ "$h", 60, 60, 1000 ] } ] } ] } } },
        { "$group" : { "_id" : { "player" : "$player", "hsDate" : "$playedgames.hsDate" }, "avg" : { "$avg" : "$playedgames.highscore" } } },
        { $sort: { _id : 1 } }
     )

到目前为止,我无法让它以120天的间隔工作。由于年份变化,还应检查年份。

请有人帮我解决这个问题。

问候, EDDI

0 个答案:

没有答案