Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB:非稳定时间序列的建议模式/文档大小_Mongodb_Meteor - Fatal编程技术网

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

MongoDB:非稳定时间序列的建议模式/文档大小,mongodb,meteor,Mongodb,Meteor,我在互联网上找到了很多关于MongoDB模式的重要信息,这些信息围绕着稳定的时间序列数据。但是,新数据对象是在稳定的基础上插入的(即每1秒更新一次) 在非稳定文档更新的情况下,是否有建议的模式?这方面的一个例子是为新数据ping外部API。在API的前几次ping期间,可能没有任何新数据可用,因此Mongo中没有任何可更新的内容。但是几次ping(可能是几秒钟,也可能是几分钟)之后,API现在发布了5个新对象,因此现在Mongo需要更新5不同的字段 因此,我们依赖于接收数据的时间,但关系不是1:

我在互联网上找到了很多关于MongoDB模式的重要信息,这些信息围绕着稳定的时间序列数据。但是,新数据对象是在稳定的基础上插入的(即每1秒更新一次)

非稳定文档更新的情况下,是否有建议的模式?这方面的一个例子是为新数据ping外部API。在API的前几次ping期间,可能没有任何新数据可用,因此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小时内加满。我们根本无法预测在给定的时间段内将发布多少新对象

与严格按照时间单位创建嵌套网格不同,该用例的更好方法是

  • 坚持使用嵌套对象模式
  • 但是要定义一组自定义的维度吗
  • 例如:

    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是随机选择的,因为,我不知道,40000个对象/文档的上限似乎是一个不错的整数?根据外部API生成的数据量,此文档可能会在一天或两天内完成,如果没有太多操作,可能会在一周内完成

    如果这是正确的方法,是否应考虑建议和/或最大网格大小?网格越小,生成的文档就越多,我们必须跟踪。网格越大,集合中浮动的文档就越少,但更新可能需要更长的时间

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

  • 它每天生产3万到6万个新对象
  • 每个对象的大小如下:

    { “日期”:“1425556988”,//交易日期 “价格”:1683.98,//每BTC的价格 “金额”:0.0134,//交易的BTC金额 “tid”:“24357098”//交易ID }

  • 客户端将不订阅这些文档-客户端数据解析是基于这些原始信息生成的

  • 我们希望永远保留这些原始文档,以防将来需要它来重新生成更高级别的分辨率

  • 任何建议都将不胜感激!谢谢

    记住,在面向文档的存储中,每个文档都需要一个时间戳。这意味着创建任意的垃圾箱是毫无意义的,因为你不能说“这个文档指的是这个小时/分钟。”

    您有3种选择:

    保持hour>minute>second结构&在没有可用数据的情况下不要创建对象。这就是无模式设计的美妙之处。这意味着如果在12:59:32时没有数据进来,该对象将丢失。将其视为稀疏矩阵

    保留小时>分钟>秒结构&为每个带有NAN的文档预先分配一个60x60对象。好处是文档不必在内存中移动。(大众选择)


    将每个时间戳存储为自己的文档。这里的好处是最大的分辨率,因为买入/卖出价格在一秒钟内最多可以更改1000次。

    MongoDB不需要文档上的时间戳。这是非常正确的。。。但是,如果没有时间值数据,您希望如何查询它呢?@MattK感谢您的输入。我喜欢选项2,但为什么选择60x60网格?为什么不是100x100或200x200?您是否建议每个文档使用网格大小?每小时1个文档,每小时60分钟,每分钟60秒。您可能会将一天的数据粘贴到单个文档中,而不会达到16MB的文档限制,但我认为这不是一种常见的做法。可能是因为它会平均为每次搜索增加12个额外步骤,而且大多数分辨率可能比一天好。如果你有时间,两种都试试,我很想看看有什么不同。这取决于你打算如何使用它。您可以模拟预先分配的时间片文档,只需为每个文档存储固定数量的对象,但这是否方便或可行取决于您将如何使用其中的对象。如果您只是异步生成更高级别的解析,以便向客户端提供摘要,那么我认为有固定数量的对象,而不是固定次数,是有意义的。@wdberkeley关于网格大小有什么建议吗?正如我所说,该文档几乎只是为了数据的冷存储而创建的。客户永远不会读它。200x200(40000对象)网格可以吗,或者我应该使用更小的网格,为什么?