我存儲微小MongoDB中的性能數據,每個集合是一種類型的性能報告,並且每個文件是在該點的測量時間在陣列上的端口:如何規範化/減少mongoDB中的時間數據?
{
"DateTime" : ISODate("2012-09-28T15:51:03.671Z"),
"array_serial" : "12345",
"Port Name" : "CL1-A",
"metric" : 104.2
}
最多可以有到每個「array_serial」128個不同的「端口名稱」條目。
由於數據的年齡,我想能夠做出平均值在增加的時間跨度:
- 長達1周:分
- 1周至1個月:5分鐘
- 1 - 3月:15分鐘
等。 這裏是如何,我場均時間,讓他們可以減少:
var resolution = 5; // How many minutes to average over
var map = function(){
var coeff = 1000 * 60 * resolution;
var roundTime = new Date(Math.round(this.DateTime.getTime()/coeff) * coeff);
emit(roundTime, { value : this.metric, count: 1 });
};
我會在精簡函數的值和計數相加,並獲得在敲定功能可按平均。
正如你所看到的,這將平均數據的時間不考慮「端口名稱」值,我需要爲每個「array_serial」上的每個「端口名稱」隨時間平均值。
那麼,如何可以包括上述地圖功能的端口名稱?發射的關鍵點應該是我稍後拆分的複合「array_serial,PortName,DateTime」值嗎?或者,我應該使用查詢功能來查詢每個不同的序列,端口和時間?我是否正確地將這些數據存儲在數據庫中?
而且,據我所知,這個數據會保存出它自己的收藏,什麼是集合中與此替代數據的標準做法平均數據?
這是你的意思嗎?因爲它不是分組四捨五入到低5分鐘的文檔(順便說一句,我改變了「日期時間」到「日期時間」):
$project: {
"year" : { $year : "$datetime" },
"month" : { $month : "$datetime" },
"day" : { $dayOfMonth : "$datetime" },
"hour" : { $hour : "$datetime" },
"minute" : { $mod : [ {$minute : "$datetime"}, 5] },
array_serial: 1,
port_name: 1,
port_number: 2,
metric: 1
}
從我可以告訴「$國防部」運營商將返回的剩餘分鐘除以五,對嗎?
這將真正幫助我,如果我能得到的聚合框架做這個操作,而不是mapreduce的。
你真的應該使用這個聚合框架而不是map/reduce。你可以用map/reduce來做到這一點,你只需要輸出端口號和時間值就可以了。聚合框架會使它簡單得多。你在用2.2嗎? –
我正在使用2.2,我還沒有開始研究聚合框架,我會看看。謝謝! –
是你的數據點統一嗎?即超過60分鐘,你保證得到相同數量的測量結果?並且測量是絕對的?不是相對於前一個或下一個,是的?你的數據點是否統一?即超過60分鐘,你保證得到相同數量的測量結果?並且測量是絕對的?不是相對於前一個或下一個,是的?你看到了問題,對吧?如果你在一個小時內得到一次較高的測量結果,而在一小時內得到一個較低的測量結果,如果不是相同的時間段,那麼你應該權衡它們,而不是做一個平均值。 –