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

Performance 使用MongoDB存储任意间隔的时间序列数据,performance,mongodb,time-series,bson,Performance,Mongodb,Time Series,Bson,我想像存储数据一样存储时间序列。与正常时间序列数据一样,数据没有设定的间隔。在同一时间序列中,数据点可能每隔几秒钟到几年出现一次。我基本上需要反复存储数据和值 我希望能够非常快速地检索该系列中最新的项目。我还希望能够快速检索两个日期范围内的所有值。写作效率不错,但没有那么重要 我最初的想法是使用键设置为日期的文档。大概是这样的: { "entry_last": 52, "entry_history": { datetime(2013, 1, 15): 94,

我想像存储数据一样存储时间序列。与正常时间序列数据一样,数据没有设定的间隔。在同一时间序列中,数据点可能每隔几秒钟到几年出现一次。我基本上需要反复存储数据和值

我希望能够非常快速地检索该系列中最新的项目。我还希望能够快速检索两个日期范围内的所有值。写作效率不错,但没有那么重要

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

{
    "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\u last
(其值在历史记录中重复)让我能够非常轻松地访问最后一个值,并且通过仅在
entry\u history
中存储日期和值,以最有效的方式存储每个数据条目


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

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

我看到您的解决方案存在的主要问题是您必须手动维护
条目\u last
,如果更新失败,这将不再有效,除非您几乎没有故障保护。如果您使用相同的数据库使用不同的技术构建另一个应用程序,则必须重新编码相同的逻辑。我不知道如何在两个日期之间轻松有效地进行查询,除非每次插入元素时都对数组进行重新排序

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

/* 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)
}

为了了解性能,我在ultrabook上运行了一个mongodb(与专用服务器的性能相去甚远),我可以在5-10毫秒内获得链接到特定标识符的最新文档。以相同的速度获取两个日期之间的所有文档。我正在查询一百万份文件的适度收集。这不是随机数据,对象的平均大小是2050B。

你有没有尝试过用几百万条输入?为了对性能做出可靠的说明,数据必须至少超过您的RAM,以确保工作集不能从RAM提供服务,并且必须从磁盘加载数据,尽管索引当然应该适合RAM。我有一个类似于我文章中的db结构,包含大约一百万个文档。在使用专用服务器之前,Mongodb在廉价的Ubuntu虚拟机(当然没有gui)中运行,只分配了一个内核和1GB的ram(数据库大约为1.4GB,不是唯一一个提供服务的),我记得响应时间的范围是相同的。当我开始为日期和链接的_id字段编制索引时,我看到了巨大的性能提升我只是想指出这些测试的要求,以便OP可以考虑。谢谢你的回答。我真的希望避免每个条目都有一个文档。这看起来像是浪费了太多的空间。它没有浪费,你可以更容易地建立索引,你的查询运行速度将加快数百倍。