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:

js

Jalankan:

bash
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/analisis-waktu.js

Output yang Dihasilkan (bagian per-jam diringkas — pada eksekusi Anda seluruh 24 jam tampil):

text
== 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 °C

Bedah 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.