Dùng bucket pattern: gom nhiều điểm dữ liệu cùng thiết bị trong một khoảng thời gian vào một document, thay vì một document cho mỗi điểm.
// bucket theo giờ: 3600 điểm gộp thành 1 document
{
deviceId: 'sensor-01',
startAt: ISODate('2026-08-06T09:00:00Z'),
count: 3600,
sumTemp: 79200, // computed pattern: tổng sẵn để tính trung bình
minTemp: 19.4,
maxTemp: 24.8,
readings: [{ t: 0, v: 22.1 }, { t: 1, v: 22.0 }]
}Ghi bằng một updateOne upsert có $push + $inc, khóa theo deviceId và startAt.
Lợi ích: số document giảm hàng nghìn lần, index nhỏ hơn tương ứng, và query theo khoảng thời gian đọc ít document hơn nhiều. Kèm theo là hai pattern hay đi cùng:
- Computed pattern: giữ sẵn count/sum/min/max trong bucket để dashboard không phải quét lại readings.
- Outlier pattern: khi một thiết bị vượt xa mức thông thường, cho phép document đó tràn sang bucket phụ (overflow: true) thay vì bắt toàn bộ schema chịu trường hợp cực đoan.
Ràng buộc phải nêu: kích thước bucket phải chọn sao cho document không tiến gần 16MB. Từ MongoDB 5.0 có time series collection làm việc gom bucket này ở tầng storage, nên với dự án mới thường dùng thẳng nó.