MongoDB 每天与 Morphia 分组
MongoDB group by day with Morphia
我有一个 MongoDB,它用 Morphia 存储简单的 Pojo:
@Entity
private static class Task{
@Id
private ObjectId id;
private Date timestamp;
private int task;
}
我想做的是获取每天的任务总数。我遇到了处理日期的问题,以便将它们投影到一天(01-07-2015 00:00:00:00)而不是带有秒和毫秒的完整日期。
可能的解决方案:
- 对于每一天,我都必须进行单独的汇总,我宁愿不这样做。
- 从这个link我想出了一个函数的想法
(timestamp.toMilliseconds() / (1000 * 60 * 60 * 24) * (1000 * 60 * 60 * 24)).toDate()
这样日子就会变圆,但我不确定如何使用 Morphia 和 java 来做到这一点。我对此很陌生,仍在寻找一种对日期进行操作的方法,但是网上有用的教程很少。
- 将时间戳投影到年月日3列,然后做一些分组。但是一天只有3个专栏的想法对我来说真的很不愉快。
请帮忙,非常感谢!
好吧,我终于找到了一些东西,就是关于第二种方法的。
由于 mongo 不支持像 timestamp.toMilliseconds() 这样的操作,我需要获取日期的每个组成部分并将它们计算到毫秒,就像提到的 link 一样。
Projection ms = expression("$millisecond", projection("timestamp"));
Projection secToMs = multiply(expression("$second", projection("timestamp")), SEC_TO_MS);
Projection minToMs = multiply(expression("$minute", projection("timestamp")), MIN_TO_MS);
Projection hourToMs = multiply(expression("$hour", projection("timestamp")), H_TO_MS);
Projection sum = add(ms, secToMs, minToMs, hourToMs);
Projection dayRounded = subtract(projection("timestamp"), sum);
然后我剩下要做的就是
datastore.createAggregation(Task.class).project(projection("timestamp",dayRounded)).aggregate(OutputClass.Class);
希望对某人有用。如果有人找到更好的解决方案请告诉我。
我建议创建一个新字段:int daycode
,您在应用层中设置 timestamp
字段时将其填充为 20150701
。然后你可以做聚合而不用计算。此外,您可以在此 daycode
字段上放置一个索引,稍后您可以选择在此字段上分片集合。
在文档数据库世界中,您希望不惜一切代价避免进行即时计算,并尽可能多地进行预计算。它可能看起来多余,但从长远来看,您将节省 CPU 个周期。
我有一个 MongoDB,它用 Morphia 存储简单的 Pojo:
@Entity
private static class Task{
@Id
private ObjectId id;
private Date timestamp;
private int task;
}
我想做的是获取每天的任务总数。我遇到了处理日期的问题,以便将它们投影到一天(01-07-2015 00:00:00:00)而不是带有秒和毫秒的完整日期。
可能的解决方案:
- 对于每一天,我都必须进行单独的汇总,我宁愿不这样做。
- 从这个link我想出了一个函数的想法
(timestamp.toMilliseconds() / (1000 * 60 * 60 * 24) * (1000 * 60 * 60 * 24)).toDate()
这样日子就会变圆,但我不确定如何使用 Morphia 和 java 来做到这一点。我对此很陌生,仍在寻找一种对日期进行操作的方法,但是网上有用的教程很少。
- 将时间戳投影到年月日3列,然后做一些分组。但是一天只有3个专栏的想法对我来说真的很不愉快。
请帮忙,非常感谢!
好吧,我终于找到了一些东西,就是关于第二种方法的。 由于 mongo 不支持像 timestamp.toMilliseconds() 这样的操作,我需要获取日期的每个组成部分并将它们计算到毫秒,就像提到的 link 一样。
Projection ms = expression("$millisecond", projection("timestamp"));
Projection secToMs = multiply(expression("$second", projection("timestamp")), SEC_TO_MS);
Projection minToMs = multiply(expression("$minute", projection("timestamp")), MIN_TO_MS);
Projection hourToMs = multiply(expression("$hour", projection("timestamp")), H_TO_MS);
Projection sum = add(ms, secToMs, minToMs, hourToMs);
Projection dayRounded = subtract(projection("timestamp"), sum);
然后我剩下要做的就是
datastore.createAggregation(Task.class).project(projection("timestamp",dayRounded)).aggregate(OutputClass.Class);
希望对某人有用。如果有人找到更好的解决方案请告诉我。
我建议创建一个新字段:int daycode
,您在应用层中设置 timestamp
字段时将其填充为 20150701
。然后你可以做聚合而不用计算。此外,您可以在此 daycode
字段上放置一个索引,稍后您可以选择在此字段上分片集合。
在文档数据库世界中,您希望不惜一切代价避免进行即时计算,并尽可能多地进行预计算。它可能看起来多余,但从长远来看,您将节省 CPU 个周期。