我将尝试使用MongoDB处理时间序列。社区通常采用的解决方案是使用子文档在不同粒度级别上存储信息(请参见MongoDB中的时间序列数据架构设计)。例如,看下面的文档:
这份文档被以分钟信息为索引,并包含一个子文档,用于存储每秒更详细的信息。
到目前为止还不错。这种方法需要进行优化才能正常工作:
这个问题在这个issue上进行了追踪。
我的问题是:有没有解决方法?我不想使用预分配空文档的批处理,因为我无法提前知道索引字段
{
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
type: “memory_used”,
values: [
999999, // 1 second
…
1000000, // nth second
1500000, // n+1th second
…
2000000 // 60th
]
}
这份文档被以分钟信息为索引,并包含一个子文档,用于存储每秒更详细的信息。
到目前为止还不错。这种方法需要进行优化才能正常工作:
要实现以上优化,可以在更新方法中使用另一种优化方法是预分配即将到来时间段的所有文档; 这永远不会导致现有文档在磁盘上增长或移动。
$setOnInsert
属性。db.getCollection('aCollection').update(
{
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
type: “memory_used”
},
{
$setOnInsert: { values: {'0': 0, '1': 0, '2': 0}},
$inc: {"values.30": 1}
},
{ upsert: true }
)
问题是在两个不同的操作中不能在同一更新中使用相同的字段。上述更新指令将产生以下错误:
Cannot update 'values' and 'values.30' at the same time
这个问题在这个issue上进行了追踪。
我的问题是:有没有解决方法?我不想使用预分配空文档的批处理,因为我无法提前知道索引字段
type
的值(就像上面的例子一样)。谢谢。
_id
应该从文档中的其他字段派生,例如使用“-”字符将它们连接起来。 - riccardo.cardin