【发布时间】:2018-06-22 13:22:05
【问题描述】:
我在academic research project 中,并使用 MongoDB 存储加速度计值的时间序列数据(物联网/遥测数据)。粒度是采样率可以在 1 到 100 Hz 之间的任何样本。目前我每个文档使用一个小时的数据,然后有一个 3 维数组,第一级是分钟,第二级是秒,第三级是样本(双数据类型)。这是受 MongoDB 用于时间序列数据演示的启发(Part 1、Part 2)。
例如
{
"_id": "2018011200:4", /* Jan 12, 2018 hour 00 UTC for sensor 4 */
"z": [
00: [ /* 00h00m */
00: [ 0.1, 0.0, -0.1, ... ], /* 00h00m00s */
01: [ 0.1, 0.0, -0.1, ... ], /* 00h00m01s */
02: [ 0.1, 0.0, -0.1, ... ], /* 00h00m02s */
...
59: [ 0.1, 0.0, -0.1, ... ] /* 00h00m59s */
], ...
]
}
这样,使用$slice获取数据子集只能在分钟级别完成,例如如果我想获取从00:00:00到00:00:01的数据,我需要获取从 MongoDB 获取 00:00 的整分钟(包含 60 秒),然后获取我在应用程序中需要的秒数。此外,如果我想从 00:00:59 到 00:01:01 获取数据,那么我需要整整两分钟,然后在应用程序子集中将它们合并回来。这有一些 IO 浪费,应用程序也有一些复杂性。顺便说一句,我不需要检索单个样本,检索(和存储)的最小单位是一秒。
我正在考虑一种稍微不同的方法,将小时文档直接分为秒数组(因为一个小时有 3600 秒),然后是样本数组。这意味着要获得 5 秒的数据,我将准确检索 5 秒的数组(即使在两个不同的文档中,如果时间范围超过一小时)。仍然会有合并不同文档中两部分秒的应用逻辑,但比小时/分钟/秒层次结构更简单。
{
"_id": "2018011200:4", /* Jan 12, 2018 hour 00 UTC for sensor 4 */
"z": [
0: [ 0.1, 0.0, -0.1, ... ], /* 00h00m00s */
1: [ 0.1, 0.0, -0.1, ... ], /* 00h00m01s */
2: [ 0.1, 0.0, -0.1, ... ], /* 00h00m02s */
...
3599: [ 0.1, 0.0, -0.1, ... ] /* 00h59m59s */
]
}
但是,我也担心替代方法存在我不知道的弱点。
你推荐哪个更好?我需要考虑哪些潜在的陷阱?或者我应该考虑另一种设计?
提前谢谢你。
【问题讨论】:
-
您需要的最大精度是多少?秒?
-
@MarkusWMahlberg 每个样本的精度在 10 毫秒(100 赫兹)到 1000 毫秒之间,但是数据总是以每个一秒的块为单位检索。例如,如果采样率为 40 Hz(典型值),每小时将有 40x60x60=144,000 个样本(每个站每个通道),但这些必须在 40 个样本块中检索,即只能获得 40 或 80 或 120 或 160 或 144,000样本,但无法获得 35 个样本或 41 个样本。
标签: arrays database mongodb time-series iot