Ето как бихте могли да го направите в рамка за агрегиране. Използвам малко опростяване - групирам само по година, месец и дата - във вашия случай ще трябва да добавите час и минута за по-фините изчисления. Освен това имате избор дали да направите претеглена средна стойност, ако разпределението на точките не е равномерно в извадката от данни, която получавате.
project={"$project" : {
"year" : {
"$year" : "$DateTime"
},
"month" : {
"$month" : "$DateTime"
},
"day" : {
"$dayOfWeek" : "$DateTime"
},
"array_serial" : 1,
"Port Name" : 1,
"metric" : 1
}
};
group={"$group" : {
"_id" : {
"a" : "$array_serial",
"P" : "$Port Name",
"y" : "$year",
"m" : "$month",
"d" : "$day"
},
"avgMetric" : {
"$avg" : "$metric"
}
}
};
db.metrics.aggregate([project, group]).result
Пуснах това с някои произволни примерни данни и получих нещо от този формат:
[
{
"_id" : {
"a" : "12345",
"P" : "CL1-B",
"y" : 2012,
"m" : 9,
"d" : 6
},
"avgMetric" : 100.8
},
{
"_id" : {
"a" : "12345",
"P" : "CL1-B",
"y" : 2012,
"m" : 9,
"d" : 7
},
"avgMetric" : 98
},
{
"_id" : {
"a" : "12345",
"P" : "CL1-A",
"y" : 2012,
"m" : 9,
"d" : 6
},
"avgMetric" : 105
}
]
Както можете да видите, това е един резултат за array_serial, име на порт, комбинация година/месец/дата. Можете да използвате $sort, за да ги поставите в реда, в който искате да ги обработите оттам.
Ето как бихте разширили стъпката на проекта, за да включите час и минута, като същевременно закръгляте минути до средна стойност за всеки пет минути:
{
"$project" : {
"year" : {
"$year" : "$DateTime"
},
"month" : {
"$month" : "$DateTime"
},
"day" : {
"$dayOfWeek" : "$DateTime"
},
"hour" : {
"$hour" : "$DateTime"
},
"fmin" : {
"$subtract" : [
{
"$minute" : "$DateTime"
},
{
"$mod" : [
{
"$minute" : "$DateTime"
},
5
]
}
]
},
"array_serial" : 1,
"Port Name" : 1,
"metric" : 1
}
}
Надяваме се, че ще можете да разширите това до вашите конкретни данни и изисквания.