我在互联网上发现了许多关于MongoDB模式的大量信息,这些模式围绕稳定时间序列数据展开。但in all,these 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小时内填写。我们根本无法预测在给定的时间段内将发布多少新对象。
不是严格按照时间单位创建嵌套网格,而是针对此用例的更好方法
例如:
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在线交易所发布时实时发布比特币交易。)我们可以假设:
每个对象的大小如下:
{ " date":" 1425556988",//贸易日期 "价格":1683.98,//每BTC的价格 "金额":0.0134,// BTC交易金额 " TID":" 24357098" //交易ID }
客户将不订阅这些文档 - 基于此原始信息生成客户端数据分辨率
任何建议都将不胜感激!谢谢!
答案 0 :(得分:1)
请记住,在面向文档的商店中,您需要在每个文档上添加时间戳。这意味着创建任意二进制文件将毫无意义,因为您无法说#34;此文档指的是此小时/分钟。"
您有3个选择:
保持小时>分钟>第二结构&当没有可用数据时,根本不创建对象。这就是无模式设计的美妙之处。这意味着如果在12:59:32没有数据进入,则该对象将丢失。把它想象成一个稀疏矩阵。
保持小时>分钟>第二结构&使用NaN为每个doc预分配一个60x60对象。好处是文件不必在内存中移动。 (热门选择)
将每个时间戳存储为自己的doc。这里的好处是最高分辨率,因为买/卖价格可以在一秒钟内改变1000次。