用于在mongodb上编辑时间序列的文档结构

时间:2013-10-31 08:36:22

标签: mongodb data-structures mongodb-query database

我有一个时间序列,随着时间的推移而增长并且(可能)进行了修订:

on“2013-01-01”:数据的第一个版本

“2013-01-01”10

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

“2013-01-01”11

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

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

on“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相同,但日期=当前日期

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

选项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 < / p> 编辑:我也在考虑选项C来加速查询1 :(虽然它可能会减慢写作速度)

{
  "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
}

3 个答案:

答案 0 :(得分:1)

与所有这样的问题一样,您是唯一能够回答此问题的人。如果您有自己的数据 - 尝试两种方式对真实数据进行实际数据基准测试,并比较更好的数据。如果您没有数据 - 请尝试模拟它。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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