我想存储类似时间序列的数据。正常时间序列数据没有设置数据间隔。数据点可以是每隔几秒钟,而不是每隔几年,所有这些都在同一时间序列中。我基本上需要一遍又一遍地存储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
。
我想知道的是我的原型是否是存储数据的有效方法。具体来说,我想知道这是否允许我有效地查询最近的值以及两个日期之间的值。如果没有,那么更好的方法是什么?
答案 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。