我应该如何在 mongodb 中存储时间序列

Roc*_*nce 12 mongodb

我需要创建一个时间序列数据库,并执行以下任务:

  • 创建新的时间序列
  • 更新现有时间序列
  • 一次查询一个或多个时间序列(例如同一日期的所有时间序列等...)

Mongo 是否适应了这一点,如果是,我应该如何构建数据库?(一个时间序列=一个文档?或者一个文档=时间序列的一个条目,所有这些文档构成了整个时间序列的集合?)

我在这里有点迷茫,我发现很难找到任何信息,因为通常 Mongo 非常灵活,因此用户可以在基础设施中进行选择。

任何专门解释如何在 Mongo 中管理时间序列的教程链接都非常受欢迎。

谢谢!

Lef*_*ium 6

我建议每个文档有一个时间序列条目。每个文档存储多个条目存在一些问题:

  • 单个文档限制在一定大小(目前为 16 MB);这限制了单个文档中可以存储的条目数
  • 随着更多条目添加到文档中,整个文档(和时间序列)将被不必要地删除并重新分配到更大的内存
  • 与对常规文档的查询相比,对子文档的查询是有限的
  • 具有非常扁平结构的文档(例如每秒一个子文档)性能不佳
  • 内置的 map-reduce 在子文档上效果不佳

另请注意,时间戳内置于默认的 MongoDB ObjectId 中。如果时间序列精度小于一秒,您可以使用它

这是来自使用 MongoDB 的事件日志记录库示例 BSON 文档

Example format of generated bson document:
{
    'thread': -1216977216,
    'level': 'ERROR',
    'timestamp': Timestamp(1290895671, 63),
    'message': 'test message',
    'fileName': '/var/projects/python/log4mongo-python/tests/test_mongo_handler.py',
    'lineNumber': 38,
    'method': 'test_emit_exception',
    'loggerName':  'testLogger',
    'exception': {
        'stackTrace': 'Traceback (most recent call last):
                       File "/var/projects/python/log4mongo-python/tests/test_mongo_handler.py", line 36, in test_emit_exception
                       raise Exception(\'exc1\')
                       Exception: exc1',
        'message': 'exc1',
        'code': 0
    }
}
Run Code Online (Sandbox Code Playgroud)

由于事件日志类似于时间序列,因此可能值得研究代码其余部分。有 Java、C#、PHP 和 Python 版本。

这是另一个类似的开源项目:Zarkov


[更新]为了回应@RockScience 的评论,我添加了更多参考: