mongodb - 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 天的间隔工作。由于年份的变化,还应检查年份。
请有人可以帮我解决这个问题。
问候,埃迪
解决方案
推荐阅读
- c++ - 最大化二分法的 GCD(最大公约数)的总和?
- inno-setup - 如何使用 InnoTools 安装后解压缩多个文件?
- c# - 将整数数组传递给 SQL Server 存储过程
- javascript - 如何重新创建 div
- node.js - 无法与我的表单详细信息一起发送图像 角度客户端显示状态代码:422 无法处理条目
- javascript - 在互联网关闭时启用离线
- alexa-skill - 我们可以在alexa意图中传递alexa序列号吗?
- c# - 这两个单例类结构有什么区别?
- reactjs - 如何使用 react-swipe 在一张幻灯片中呈现多个项目?
- python - 出现错误:服务器 Python3 不支持 SMTP AUTH 扩展