在MongoDb中存储花费的时间(小时:分钟)的最佳方法是什么?

时间:2014-03-02 10:10:01

标签: mongodb mlab

我正在玩一个小型网络应用程序来存储每天花费的任务和时间,并在每周和每月报告中进行报告。

对于我的后端,我想使用MongoDb,但无法立即找到存储花在任务上的时间的最佳方法。 我没有兴趣存储实际的时间范围(开始和停止日期),只花费几小时的时间:分钟。

由于我将每周和每月报告,我需要能够每周,每月计算总和。

存储花费的时间的最佳方式是什么?

我倾向于只将分钟存储在32位整数中,将其转换为小时:客户端上的分钟。 (或者更好的是,已经在Mongodb聚合查询中转换它,如果可能的话?)

我的任务文档看起来像这样

{
    "task_id": {
        "$oid": "5311a0a4e4b0386017fce592"
    },
    "timeEntry_date": "ISODate('2014-03-02')",
    "timeSpent_minutes": 30
}

这是MongoDb的方式吗?

很抱歉,如果我在这里说明显而易见的事情,那就开始了解MongoDB ......

2 个答案:

答案 0 :(得分:3)

与MongoDB一样“这取决于您的使用情况”。在MongoDB中,您应该构建“架构”,以便它描述您的应用程序需求而不是数据结构。

如果您的应用程序是写密集型的,那么您应该有一个非常快速和简单的写入过程。例如,您可以存储花费的毫秒数,然后在读取

上进行计算

如果您希望应用程序的读取速度更快,您可以使用

time_spent: {
  hours: 1,
  minutes: 23,
  seconds: 45
}

在您的文件中

PS 我认为

"task_id": {
        "$oid": "5311a0a4e4b0386017fce592"
}

会更好

task_id: "5311a0a4e4b0386017fce592"

答案 1 :(得分:1)

根据规定的要求,您最好将数据作为数值提供。与可用的其他几个选项相比,有更多的查询和聚合运算符可以轻松用于数值。

虽然您可以将句点存储为字符串,但它需要始终为零填充才能正确排序。使用字符串,您只能有效地执行完全匹配和范围查询(例如,查找"0030""0015""0045"之间的所有内容)。

虽然您也可以存储开始和结束时间并尝试计算周期,但它会给查询增加不必要的复杂性,实际上可能只使用聚合框架来进行某些类型的查询。根据您的需要,您可能会发现一些有趣的想法here

任何时间长度直接存储为值而非计算值的选项之间的绝对性能差异不太可能是可测量的,因为它们会为每个选项消耗几乎相同的空间量。如果您担心绝对磁盘空间使用情况,我建议您考虑使用较短的字段名称。每个文档都包含完整的字段名称。 Mongo的一些驱动程序提供了一种方便的方法来使用字段名称的别名(通过保持您在代码友好中使用的名称并使用存储文档的缩短版本)。

我会存储一个最适合您将遇到的最长时间的整数数值。如果经常查询索引,您可以添加索引,并轻松地将其在客户端上转换为更人性化的内容。