【问题标题】:structure of documents for versioning of a time series on mongodb用于在 mongodb 上对时间序列进行版本控制的文档结构
【发布时间】:2013-10-31 08:36:22
【问题描述】:

我有一个时间序列随着时间的推移而增长并(可能)修改:

关于“2013-01-01”:第一版数据

“2013-01-01”10

关于“2013-01-02”:1月1日的数据从10日修改为11日

“2013-01-01”11

关于“2013-02-01”:2月1日第一版数据

“2013-01-01”11
"2013-02-01" 20

关于“2013-02-02”:2月1日的数据从20日修改为21日

“2013-01-01”11
"2013-02-01" 21

最常见的查询:

query1:获取所有日期的最新版本

“2013-01-01”11
"2013-02-01" 21

query2:获取特定日期已知的时间序列:

比如查询“2013-02-01”,我需要得到
《2013-01-01》11
"2013-02-01" 20

请注意,query1 与 query2 相同,但日期 = 当前日期

我需要帮助来构建我的文档,并且由于我来自关系背景,我不确定我的结构的含义。我基本上已经确定了 2 种可能的结构,很乐意收到一些反馈或其他结构的建议。

选项 A:每个版本都在一个单独的文档中

{
  "id":"1",
  "date":"2013-01-01",
  "version_date":"2013-01-01",
  "value":10
}

{
  "id":"1",
  "date":"2013-01-01",
  "version_date":"2013-01-02",
  "value":11
}

{
  "id":"1",
  "date":"2013-02-01",
  "version_date":"2013-02-01",
  "value":20
}

{
  "id":"1",
  "date":"2013-02-01",
  "version_date":"2013-02-02",
  "value":21
}

选项 B:一个文档包含一个日期的所有修订

{
  "id":"1",
  "date":"2013-01-01",
  "values" : [ 
              { "version_date":"2013-01-01",
                "value":10
              },
              {
                "version_date":"2013-01-02",
                "value":11
              }
}

{
  "id":"1",
  "date":"2013-02-01",
  "values" : [ 
              { "version_date":"2013-02-01",
                "value":20
              },
              {
                "version_date":"2013-02-02",
                "value":21
              }
}

在选项 B 中,我还担心执行更新查询可能会有点困难,因为文档有一个不断增长的部分,我不确定 mongodb 是否很好地支持/优化了这一点

编辑:我也在考虑使用选项 C 来加快 query1 的速度:(尽管​​它可能会减慢一点写入速度)

{
  "id":"1",
  "date":"2013-01-01",
  "values" : [ 
              { "version_date":"2013-01-01",
                "value":10
              },
              {
                "version_date":"2013-01-02",
                "value":11
              }
  "last_value":11
}

{
  "id":"1",
  "date":"2013-02-01",
  "values" : [ 
              { "version_date":"2013-02-01",
                "value":20
              },
              {
                "version_date":"2013-02-02",
                "value":21
              }
  "last_value":21
}

【问题讨论】:

标签: mongodb data-structures mongodb-query database


【解决方案1】:

与所有此类问题一样,您是唯一可以回答此问题的人。如果你有你的数据 - 尝试两种方式对真实数据和真实查询进行一些基准测试,并比较哪个更好。如果您没有数据 - 尝试模拟它。

请记住,对于选项 B 和 C,您必须注意 16 Mb limit per document。因此,如果您有很多版本 - 您可能会达到限制(但您必须了解,应该有太多版本才能达到 16Mb)。另请记住,更新此类文档可以使用许多moves on the disk

如果您需要一次选择特定文档的所有修订版,选项 B 和 C 会很好,但我在您最经常的查询中没有发现这一点。请记住,使用正确的索引,您也可以使用选项 A 来实现这一目标。

【讨论】:

  • 感谢您的输入,我会记住每个文档 16Mb 的限制 - 在我的情况下应该没问题。事实上,最常见的查询是相反的:获取一个版本的整个时间序列。
  • 如果这是最频繁的数据,那么选项 B/C 可能表现良好。但我必须再强调一次:使用您自己的数据进行基准测试,然后再选择合适的选项
【解决方案2】:

在官方页面上实际上有一篇关于这个主题的博客文章:http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in-mongodb 如果需要,请查看并提出任何其他问题。

【讨论】:

    【解决方案3】:

    考虑到上述选项和您的要求,最好基于 date 创建您的结构,就像您在选项-B 中提到的那样。如果您的 date 被索引,那就太好了。显示为什么这似乎是适当的优化解决方案的一些场景(易于阅读、更新)是:

    1. 检索特定日期的所有版本。
    2. 检索特定时间段的所有版本(即范围,例如从 2012 年 1 月到 2012 年 2 月)
    3. 插入新版本,只需使用$push
    4. 删除旧版本,只需使用$pull 进行简单查询。

    【讨论】:

    • 好的,谢谢您的回答。执行query2是否容易:获取某个日期的版本(即:所有日期的max version_date的值)?还是我必须用我自己的编程语言获取所有并在 JSON 中执行这个子集
    • @RockScience,不需要编程语言逻辑,只要正确使用$max就可以了。
    • @RockScience 是的,也可以参考$elemMatch,这将对您的结构有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多