我存储微小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分钟,你保证得到相同数量的测量结果?并且测量是绝对的?不是相对于前一个或下一个,是的?你看到了问题,对吧?如果你在一个小时内得到一次较高的测量结果,而在一小时内得到一个较低的测量结果,如果不是相同的时间段,那么你应该权衡它们,而不是做一个平均值。 –