1

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

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

我需要帮助来构建我的文档,并且由于我来自关系背景,我不确定我的结构的含义。我基本上已经确定了 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
}
4

3 回答 3

1

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

请记住,对于选项 B 和 C,您必须了解每个文档 16 Mb 的限制。因此,如果您有很多版本 - 您可能会达到限制(但您必须了解,应该有太多版本才能达到 16Mb)。还要记住,更新此类文档可以在磁盘上进行多次移动

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

于 2013-10-31T09:21:45.573 回答
1

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

于 2013-11-01T18:25:16.743 回答
0

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

  1. 检索特定日期的所有版本。
  2. 检索特定时间段的所有版本(即范围,例如从 2012 年 1 月到 2012 年 2 月)
  3. 插入一个新版本,你只需要使用$push
  4. 删除旧版本,只需使用$pull进行简单查询。
于 2013-10-31T09:10:18.347 回答