2015-08-26 78 views
1

我管理我的電腦的時間序列數據MongoDB中的格式爲:
聚集在時間序列數據在MongoDB中

  • 我創建爲每個服務器一個小時的文檔。
  • 然後我試圖以下面的格式存儲每分鐘的cpuMetric數據。

問題是我不知道如何使用cpuMetric中的數據進行聚合。

作爲更具體的我想從這個文件得到最後10分鐘的數據。


{ "_id" : "192.168.xxx.xxx1440yyy000", 
     "time" : ISODate("2015-yy-xxT05:30:00Z"), 
     "ip" : "192.168.xxx.xxx", 
     "serverId" : "abc", 
     "cpuMetric" : { 
     "0" : { "usage" : 25.99, "process" : 123, "cores" : 4, "speed" : 2394, "uptime" : 45839 }, 
     "1" : { "speed" : 2394, "uptime" : 45899, "usage" : 26.003333333333334, "process" : 121, "cores" : 4 }, 
     . 
     . 
     . 
     "58" : { "usage" : 26.093333333333334, "process" : 119, "cores" : 4, "speed" : 2394, "uptime" : 45959 }, 
     "59" : { "usage" : 26.73, "process" : 119, "cores" : 4, "speed" : 2394, "uptime" : 46019 } 
     } 
    } 

在此先感謝!

+0

你想「得到最後十分鐘」怎麼樣?把它們加起來?平均他們?只列出它們?請解釋。 –

+0

對不起,我沒有清除結構。 cpuMetric.0表示第0分鐘數據,同樣cpuMetric.59表示第59分鐘數據。現在我想列出cpuMetric [49:59]。 –

+0

我明白如何閱讀它。我要求「你」告訴「我們」你想如何「使用這些數據」。你所說的只是「得到最後十分鐘」。但那麼做什麼呢? –

回答

1

如果還不算太晚,最好更改數據模式。有了這個,你不能使用索引,因爲你使用基本上是分鐘的值作爲字段名。因此,更好的方法是將分鐘數據保存在數組中,並將數據值用作分鐘。然後您可以索引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} } } } 
) 
+0

我接受你的答案,但是你能幫我用我的數據模型格式嗎?我指的是[本文檔](http://blog.mongodb。org/post/65517193370/schema-design-for-time-series-data-in-mongodb) –

+0

那麼你可以根據'time'字段對數據進行排序,這會給你最後一個小時,然後你可以投影最後一個十分鐘手動。這是可行的,因爲您的記錄最多隻能包含60個元素,並且將所請求的10個數據投影到該記錄中並不會很昂貴。 – cubbuk

+0

感謝您的解決方案。我將比較更改模式的時間複雜性是否會更好,或者使用相同的模式進行比較。 –