Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB中timeseries数据的聚合_Mongodb_Time Series - Fatal编程技术网

MongoDB中timeseries数据的聚合

MongoDB中timeseries数据的聚合,mongodb,time-series,Mongodb,Time Series,我正在管理MongoDB中的PC时间序列数据,格式如下: 我正在为每台服务器创建一个文档,持续一个小时 然后,我尝试以如下所示的格式存储每分钟的cpuMetric数据 问题是我不知道如何在聚合中使用cpuMetric中的数据 更具体地说,我想从本文档中获取最后10分钟的数据 提前谢谢 如果还不太晚,最好更改数据模式。在这个例子中,您不能使用索引,因为您使用了基本上是分钟的值作为字段名。因此,更好的方法是将分钟数据保存在数组中,如下所示,并将数据值用作分钟。然后,您可以索引cpuMetri

我正在管理MongoDB中的PC时间序列数据,格式如下:

  • 我正在为每台服务器创建一个文档,持续一个小时
  • 然后,我尝试以如下所示的格式存储每分钟的cpuMetric数据
问题是我不知道如何在聚合中使用cpuMetric中的数据

更具体地说,我想从本文档中获取最后10分钟的数据




提前谢谢

如果还不太晚,最好更改数据模式。在这个例子中,您不能使用索引,因为您使用了基本上是分钟的值作为字段名。因此,更好的方法是将分钟数据保存在数组中,如下所示,并将数据值用作分钟。然后,您可以索引
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} } } }
)