使用MongoDB存储任意间隔的时间序列数据

时间:2015-12-04 05:52:13

标签: performance mongodb time-series bson

我想存储类似时间序列的数据。正常时间序列数据没有设置数据间隔。数据点可以是每隔几秒钟,而不是每隔几年,所有这些都在同一时间序列中。我基本上需要一遍又一遍地存储Date data type和一个值。

我希望能够快速检索系列中最新的项目。我还希望能够快速检索两个日期之间范围内的所有值。写作效率很好但不那么重要。

我最初的想法是使用键设置为日期的文档。像这样:

SurfaceView

然而,从我的承诺,钥匙必须是字符串。

然后我想出了这个原型:

{
    "entry_last": 52,
    "entry_history": {
        datetime(2013, 1, 15): 94,
        datetime(2014, 12, 23): 25,
        datetime(2016, 10, 23, 5, 34, 00): 52
    }
}

这里的想法是让我自己很容易地访问{ "entry_last": 52, "entry_history": [ [datetime(2013, 1, 15), 94], [datetime(2014, 12, 23), 25], [datetime(2016, 10, 23, 5, 34, 00), 52], ] } 的最后一个值(其值在历史记录中重复),以及以最有效的方式存储每个数据条目仅将日期和值存储在entry_last

我想知道的是我的原型是否是存储数据的有效方法。具体来说,我想知道这是否允许我有效地查询最近的值以及两个日期之间的值。如果没有,那么更好的方法是什么?

1 个答案:

答案 0 :(得分:0)

您不必手动指定索引,只能存储日期时间并使用数组的索引。

我在您的解决方案中看到的主要问题是您必须手动维护entry_last,如果更新失败,这将不再有效,除非您的故障很少。如果使用相同的db构建另一个使用不同技术的应用程序,则必须重新编码相同的逻辑。我没有看到如何在这里轻松有效地查询两个日期,除非您每次插入元素时重新排序数组。

如果我必须设计这种数据存储,我会创建另一个集合来存储历史记录(通过_id链接到您的条目)并将日期索引到快速查询。但它可能取决于您的数据量。

/* entry */
{
    _id: 1234,
    "entryName": 'name'
}

/* history */
{
    _id: 9876,
    "_linkedEntryId": 1234,
    "date": new Date(2013, 1, 15)
}

{
    _id: 9877,
    "_linkedEntryId": 1234,
    "date": new Date(2014, 12, 23)
}

{
    _id: 9878,
    "_linkedEntryId": 1234,
    "date": new Date(2016, 10, 23, 5, 34, 00)
}

为了了解性能,我在我的超极本上运行了mongodb(远离专用服务器的性能),我可以在5-10ms内获得与特定标识符相关联的最新文档。获得两个日期之间的所有文档的速度相同。我正在查询一百万份文件的适度集合。它不是随机数据,平均对象的大小是2050B。