MongoDB:非稳定时间序列的推荐模式/文档大小

时间:2015-03-06 12:57:58

标签: mongodb meteor

我在互联网上发现了许多关于MongoDB模式的大量信息,这些模式围绕稳定时间序列数据展开。但in allthese examples新数据对象正在稳定的基础上插入(即每1秒更新一次)。

非稳定文档更新的情况下是否有推荐的架构?一个例子是ping外部API以获取新数据。在前几次ping API时,可能没有任何新数据可用,因此在Mongo中没有任何更新。但是后来有几次ping(可能是秒,或者可能是几分钟),API现在已经发布了5个新对象,所以现在Mongo需要更新5个不同的字段。

因此我们依赖于接收数据的时间,但关系不是1:1(数据流不是常数)。这意味着预先分配和填充60秒x 60分钟的嵌套对象......

values: {
0: { 0: {obj}, 1: {obj}, …, 59: {obj} },
1: { 0: {obj}, 1: {obj}, …, 59: {obj} },
…,
58: { 0: {obj}, 1: {obj}, …, 59: {obj} },
59: { 0: {obj}, 1: {obj}, …, 59: {obj} }

}

...没有多大意义,因为我们无法保证我们可以在1小时内填写。我们根本无法预测在给定的时间段内将发布多少新对象。

不是严格按照时间单位创建嵌套网格,而是针对此用例的更好方法

  1. 坚持使用嵌套对象架构
  2. 但是定义一组自定义维度?
  3. 例如:

    values: {
    0: { 0: {obj}, 1: {obj}, …, 199: {obj} },
    1: { 0: {obj}, 1: {obj}, …, 199: {obj} },
    …,
    198: { 0: {obj}, 1: {obj}, …, {obj}: 1100000 },
    199: { 0: {obj}, 1: {obj}, …, {obj}: 1500000 }
    

    }

    ...其中200x200是随机选择的,因为我不知道,封装40,000个物品/文件似乎是一个不错的圆形数字?根据外部API生成的数据量,如果没有多少动作,此文档可以在一天,两天或一周内填写。

    如果这是正确的方法,是否应该考虑推荐和/或最大网格尺寸?网格越小,生成的文档就越多,我们就必须跟踪。网格越大,集合中浮动的文档越少,但更新可能会使头发更长。

    这个答案可能基于一些假设,因此为了讨论的目的,让我们假设我们对this API endpoint感兴趣。 (此API在BTCChina在线交易所发布时实时发布比特币交易。)我们可以假设:

    1. 每天产生30k到60k新物品
    2. 每个对象的大小如下:

      {   " date":" 1425556988",//贸易日期   "价格":1683.98,//每BTC的价格   "金额":0.0134,// BTC交易金额   " TID":" 24357098" //交易ID }

    3. 客户将订阅这些文档 - 基于此原始信息生成客户端数据分辨率

    4. 我们希望永远保留这些原始文档,因为我们将来需要它来重新生成更高级别的分辨率
    5. 任何建议都将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

请记住,在面向文档的商店中,您需要在每个文档上添加时间戳。这意味着创建任意二进制文件将毫无意义,因为您无法说#34;此文档指的是此小时/分钟。"

您有3个选择:

保持小时>分钟>第二结构&当没有可用数据时,根本不创建对象。这就是无模式设计的美妙之处。这意味着如果在12:59:32没有数据进入,则该对象将丢失。把它想象成一个稀疏矩阵。

保持小时>分钟>第二结构&使用NaN为每个doc预分配一个60x60对象。好处是文件不必在内存中移动。 (热门选择)

将每个时间戳存储为自己的doc。这里的好处是最高分辨率,因为买/卖价格可以在一秒钟内改变1000次。