【问题标题】:What is the best way to store the amount of time spent (hours : minutes) in MongoDb?在 MongoDb 中存储花费的时间(小时:分钟)的最佳方法是什么?
【发布时间】:2014-04-03 06:57:58
【问题描述】:

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

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

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

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

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

我的任务文档将如下所示

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

这是在 MongoDb 中要走的路吗?

对不起,如果我在这里陈述显而易见的事情,刚刚开始了解 MongoDB...

【问题讨论】:

  • 在这变成“基于意见”的讨论之前,我在这里看到的一件事是,这类信息只会最适合你。如果您可以在问题中提出一些用例,那么实际上听起来就像是在询问您正在做的事情是否最适合这些“用例”。否则,有些人只会在意见中提出答案,以尝试并获得代表。这就是我们在这里试图避免的。

标签: mongodb mlab


【解决方案1】:

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

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

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

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

在您的文档中

PS我认为

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

会更好

task_id: "5311a0a4e4b0386017fce592"

【讨论】:

  • 我觉得$oid其实是ObjectId的内部属性
【解决方案2】:

鉴于上述要求,最好将数据作为数值提供。与可用的少数其他选项相比,可以轻松用于数值的查询和聚合运算符要多得多。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2011-04-17
    • 2017-09-18
    相关资源
    最近更新 更多