Đây là cách bạn có thể làm điều đó trong khuôn khổ tổng hợp. Tôi đang sử dụng một đơn giản hóa nhỏ - tôi chỉ nhóm vào Năm, Tháng và Ngày - trong trường hợp của bạn, bạn sẽ cần thêm giờ và phút cho các tính toán chi tiết hơn. Bạn cũng có thể lựa chọn xem có thực hiện trung bình có trọng số hay không nếu phân phối điểm không đồng nhất trong mẫu dữ liệu bạn nhận được.
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
Tôi đã chạy điều này với một số dữ liệu mẫu ngẫu nhiên và nhận được một cái gì đó có định dạng sau:
[
{
"_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
}
]
Như bạn có thể thấy, đây là một kết quả cho mỗi kết hợp array_serial, port name, năm / tháng / ngày. Bạn có thể sử dụng $ sort để sắp xếp chúng theo thứ tự bạn muốn để xử lý chúng từ đó.
Đây là cách bạn sẽ mở rộng bước dự án để bao gồm giờ và phút trong khi làm tròn số phút thành trung bình sau mỗi năm phút:
{
"$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
}
}
Hy vọng bạn sẽ có thể mở rộng điều đó cho dữ liệu và yêu cầu cụ thể của mình.