Điều này làm những gì bạn cần. Tôi đã chuẩn hóa thời gian trong dữ liệu để chúng nhóm lại với nhau (Bạn có thể làm điều gì đó như thế này). Ý tưởng là $group
và đẩy time
của và total
thành các mảng riêng biệt. Sau đó, $unwind
time
mảng và bạn đã tạo một bản sao của total
mảng cho mỗi time
tài liệu. Sau đó, bạn có thể tính toán runningTotal
(hoặc một cái gì đó như giá trị trung bình luân phiên) từ mảng chứa tất cả dữ liệu cho các thời điểm khác nhau. 'Chỉ mục' được tạo bởi $unwind
là chỉ số mảng cho total
tương ứng với time
đó . Điều quan trọng là phải $sort
trước $unwind
ing vì điều này đảm bảo các mảng theo đúng thứ tự.
db.temp.aggregate(
[
{
'$group': {
'_id': '$time',
'total': { '$sum': '$value' }
}
},
{
'$sort': {
'_id': 1
}
},
{
'$group': {
'_id': 0,
'time': { '$push': '$_id' },
'totals': { '$push': '$total' }
}
},
{
'$unwind': {
'path' : '$time',
'includeArrayIndex' : 'index'
}
},
{
'$project': {
'_id': 0,
'time': { '$dateToString': { 'format': '%Y-%m-%d', 'date': '$time' } },
'total': { '$arrayElemAt': [ '$totals', '$index' ] },
'runningTotal': { '$sum': { '$slice': [ '$totals', { '$add': [ '$index', 1 ] } ] } },
}
},
]
);
Tôi đã sử dụng một cái gì đó tương tự trên một bộ sưu tập với ~ 80 000 tài liệu, tổng hợp thành 63 kết quả. Tôi không chắc nó sẽ hoạt động tốt như thế nào trên các bộ sưu tập lớn hơn, nhưng tôi nhận thấy rằng việc thực hiện các phép biến đổi (phép chiếu, thao tác mảng) trên dữ liệu tổng hợp dường như không có chi phí hiệu suất lớn khi dữ liệu được giảm xuống kích thước có thể quản lý được.