我希望有人能帮我解决实际问题。我使用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