Data sensor yang tersimpan belum berarti apa-apa sebelum dijawab pertanyaan: seberapa panas Jakarta kemarin siang? Sensor mana yang paling fluktuatif? Bagaimana suhu bergerak dari jam ke jam? Bagian ini mengubah 500 pengukuran menjadi jawaban lewat empat pipeline aggregation — masing-masing memperlihatkan satu pola analisis waktu yang bisa langsung dipakai di data nyata: statistik per seri, agregasi per jam, tren berjendela, dan perbandingan rentang.
Skrip Analisis #
analisis-waktu.js memuat keempat pipeline dan hanya membaca — tidak mengubah satu titik data pun:
Jalankan:
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/analisis-waktu.jsOutput yang Dihasilkan (bagian per-jam diringkas — pada eksekusi Anda seluruh 24 jam tampil):
== statistik per sensor (seluruh periode) ==
BDG-07 Bandung rata 25.9528 °C | min 24 maks 28 | rh rata-rata 80% | 125 titik
JKT-01 Jakarta rata 28.9464 °C | min 27.1 maks 30.9 | rh rata-rata 78% | 125 titik
SBY-12 Surabaya rata 30.976 °C | min 29 maks 32.9 | rh rata-rata 70% | 125 titik
YOG-03 Yogyakarta rata 27.968 °C | min 26.1 maks 30 | rh rata-rata 77% | 125 titik
== rata-rata suhu per jam: JKT-01, 1 Januari 2026 ==
00:00 UTC -> 27.7 °C (2 titik)
01:00 UTC -> 27.6 °C (2 titik)
02:00 UTC -> 27.15 °C (2 titik)
...
14:00 UTC -> 30.5 °C (2 titik)
15:00 UTC -> 30.6 °C (2 titik)
...
23:00 UTC -> 28.05 °C (2 titik)
== tren BDG-07: rata-rata bergerak 3 jam (6 titik terakhir) ==
01 Jan 00:00 suhu 24.6 °C | bergerak 24.6 °C | delta -
01 Jan 00:30 suhu 24.9 °C | bergerak 24.75 °C | delta +0.3
01 Jan 01:00 suhu 24.5 °C | bergerak 24.67 °C | delta -0.4
01 Jan 01:30 suhu 24.4 °C | bergerak 24.6 °C | delta -0.1
01 Jan 02:00 suhu 24.2 °C | bergerak 24.52 °C | delta -0.2
01 Jan 02:30 suhu 25 °C | bergerak 24.6 °C | delta +0.8
01 Jan 03:00 suhu 24.1 °C | bergerak 24.52 °C | delta -0.9
01 Jan 03:30 suhu 24.7 °C | bergerak 24.48 °C | delta +0.6
== rentang waktu 2 Januari: pagi vs sore (semua sensor) ==
pagi 00:00-06:00 -> 48 titik | rata 27.13 °C | tertinggi 30 °C
sore 12:00-18:00 -> 48 titik | rata 29.82 °C | tertinggi 32.8 °CBedah Empat Pola Analisis #
Pertama — statistik per seri. Pipeline pertama mengelompokkan berdasarkan "$sensor.sensor_id" dengan akumulator $avg, $min, $max, dan $sum: 1. Hasilnya meneguhkan desain dataset: Surabaya di 30,98 °C rata-rata, Bandung 25,95 °C, rentang keduanya tidak bersinggungan — pola yang mudah diverifikasi mata.
Kedua — agregasi per jam. Inilah wajah khas analisis time series: $group dengan _id: { $dateTrunc: { date: "$ts", unit: "hour" } }. $dateTrunc memotong setiap waktu ke awal jam, sehingga dua titik dalam jam yang sama jatuh ke satu kelompok. Ganti unit: "hour" menjadi "day" atau "month" dan pola yang sama melompat ke resolusi berbeda tanpa perubahan lain.
Ketiga — tren berjendela. $setWindowFields adalah tahap paling kuat di sini: partitionBy: "$sensor.sensor_id" mengisolasi tiap sensor, sortBy: { ts: 1 } menjamin urutan waktu, dan window: { documents: [-5, 0] } membuat rataBergerak menjadi rata-rata 6 titik terakhir (3 jam data 30-menit). $shift menarik nilai titik sebelumnya untuk kolom delta — selisih antar pengukuran yang membuat pergerakan terbaca.
Keempat — perbandingan rentang. Fungsi rentangStat() membungkus pipeline $match rentang + $group menjadi satu panggilan. Pagi 2 Januari (27,13 °C) vs sore hari yang sama (29,82 °C) — selisih 2,7 derajat dari data yang sama, jawaban atas pertanyaan yang tadi masih berupa deretan angka.
Bagian terakhir menutup siklus hidup data: berapa lama pengukuran mentah disimpan, dan apa yang tersisa setelahnya.