MongoDB中timeseries数据的聚合
我正在管理MongoDB中的PC时间序列数据,格式如下:MongoDB中timeseries数据的聚合,mongodb,time-series,Mongodb,Time Series,我正在管理MongoDB中的PC时间序列数据,格式如下: 我正在为每台服务器创建一个文档,持续一个小时 然后,我尝试以如下所示的格式存储每分钟的cpuMetric数据 问题是我不知道如何在聚合中使用cpuMetric中的数据 更具体地说,我想从本文档中获取最后10分钟的数据 提前谢谢 如果还不太晚,最好更改数据模式。在这个例子中,您不能使用索引,因为您使用了基本上是分钟的值作为字段名。因此,更好的方法是将分钟数据保存在数组中,如下所示,并将数据值用作分钟。然后,您可以索引cpuMetri
- 我正在为每台服务器创建一个文档,持续一个小时
- 然后,我尝试以如下所示的格式存储每分钟的cpuMetric数据
提前谢谢 如果还不太晚,最好更改数据模式。在这个例子中,您不能使用索引,因为您使用了基本上是分钟的值作为字段名。因此,更好的方法是将分钟数据保存在数组中,如下所示,并将数据值用作分钟。然后,您可以索引
cpuMetric.minute
字段并轻松对数据进行排序
{ "_id" : "192.168.xxx.xxx1440yyy000",
"time" : ISODate("2015-yy-xxT05:30:00Z"),
"ip" : "192.168.xxx.xxx",
"serverId" : "abc",
"cpuMetric: [{minute: ISODate("2015-yy-xxT05:30:00Z")", { "usage" : 25.99, "process" : 123, "cores" : 4, "speed" : 2394, "uptime" : 45839 }}, {minute: ISODate("2015-yy-xxT05:31:00Z"), { "speed" : 2394, "uptime" : 45899, "usage" : 26.003333333333334, "process" : 121, "cores" : 4 }}, ...]
之后,您可以在字段cpuMetric.minute
上查询数据并对数据进行排序
db.pcmetrics.find(
{ cpuMetric: { $elemMatch: {minute: {$gte: 10MinutesAgoInDateFormat} } } }
)
你想“最后十分钟”怎么说?把它们加起来?平均他们?把它们列出来?请解释一下。对不起,我没有弄清楚结构。cpuMetric.0表示第0分钟数据,cpuMetric.59表示第59分钟数据。现在我只想列出cpuMetric[49:59],我知道怎么读了。我要求“你”告诉“我们”你想如何“使用数据”。你所说的就是“抓紧最后十分钟”。但是你用它做什么呢?我只想把它们列出来。好吧,你是这样存储的,那么你“认为”你是做什么的呢?指向具有这样命名键的对象的路径需要是显式的。你不能说
cpuMetric[50..59]
。因此,唯一的方法是修改文档(聚合和mapReduce),并明确列出每个文档(聚合)或在代码中执行(mapReduce)。但仅仅列出一个文档,这两种方法都是过分的。循环客户端代码中的索引值。但是您需要返回“整个”文档,而不仅仅是10个时间段。或者你改变了结构。我接受你的回答,但你能帮我处理一下数据模型的格式吗。我指的是,那么您可以根据时间
字段对数据进行排序,这将为您提供最后一个小时,然后您可以手动预测最后十分钟。这是可行的,因为您的记录最多包含60个元素,并且从该记录中投影请求的10个数据不会非常昂贵。感谢您的解决方案。我将比较更改模式是更好还是使用相同的模式的时间复杂性。我认为在您的情况下,这无关紧要,因为在这种情况下,您的文档包含的行非常少,只有60行。在这种方法中,您只需检查最后2个文档,以确保您拥有最后10分钟的时间。请记住,通常最好不要将文档的值用作字段名,因为几乎不可能对这些值进行索引。Mongo以BSON格式将日期值存储为8字节。检查已接受的答案:
db.pcmetrics.find(
{ cpuMetric: { $elemMatch: {minute: {$gte: 10MinutesAgoInDateFormat} } } }
)