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)而不是带有秒和毫秒的完整日期。

可能的解决方案:

  1. 对于每一天,我都必须进行单独的汇总,我宁愿不这样做。
  2. 从这个link我想出了一个函数的想法

    (timestamp.toMilliseconds() / (1000 * 60 * 60 * 24) * (1000 * 60 * 60 * 24)).toDate()

这样日子就会变圆,但我不确定如何使用 Morphia 和 java 来做到这一点。我对此很陌生,仍在寻找一种对日期进行操作的方法,但是网上有用的教程很少。

  1. 将时间戳投影到年月日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 个周期。