我建议每个文档有一个时间序列条目。每个文档存储多个条目存在一些问题:
- 单个文档被限制为一定大小(当前为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
}
}
由于事件日志类似于时间序列,因此值得研究其余代码。有Java,C#,PHP和Python版本。
这是另一个类似的开源项目:Zarkov
[更新]为了回应@RockScience的评论,我添加了更多参考: