首页 > 解决方案 > MongoDB 2.4 - 按日期聚合组,间隔 120 天

问题描述

我希望有人可以帮助我解决我的实际问题。我从 2 个月开始使用 MongoDB,过去我只使用 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 天的间隔工作。由于年份的变化,还应检查年份。

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

问候,埃迪

标签: mongodbdateintervalsaggregation

解决方案


推荐阅读