Sensor cuaca menulis data setiap tiga puluh menit, setiap hari, tanpa henti: suhu dan kelembapan per kota, ribuan titik data per minggu. Data semacam ini punya watak khas — ditulis sekali lalu tidak pernah diubah, selalu punya waktu kejadian, dan nilainya justru muncul saat diagregasi per jam atau per hari. Proyek ini mengajak kita membangun sistem pencatatan data sensor di atas time series collection MongoDB: dari perancangan schema metaField + timeField, penulisan 500 pengukuran deterministik, analisis agregasi berbasis waktu, sampai kebijakan retensi via TTL dan downsampling.

Sama seperti proyek-proyek sebelumnya, seluruh kode berbentuk skrip mongosh yang dijalankan lewat --file — fokus kita adalah perancangan data time series dan pola query-nya, bukan kerangka aplikasi.

Tujuan Proyek #

Setelah menyelesaikan proyek ini, kita memiliki sistem pencatatan sensor dengan kemampuan berikut:

  • Time series collection yang benar: sensor_cuaca dengan timeField: "ts", metaField: "sensor", dan granularity: "minutes" — lengkap dengan verifikasi tipe collection dan index otomatisnya.
  • Data uji deterministik: 500 pengukuran dari 4 sensor (Jakarta, Bandung, Surabaya, Yogyakarta) yang dibangkitkan generator seeded — setiap eksekusi menghasilkan angka yang sama sehingga analisis dan tes selalu konsisten.
  • Analisis berbasis waktu: statistik per sensor, rata-rata per jam dengan $dateTrunc, tren dengan $setWindowFields + $shift, dan perbandingan rentang waktu pagi vs sore.
  • Retensi dua lapis: TTL expireAfterSeconds lewat collMod (dibuktikan nyata menghapus data) dan downsampling menjadi ringkasan_harian lewat $merge.
  • Bukti performa: explain("executionStats") memperlihatkan bagaimana filter rentang waktu memangkas bucket, dan perbandingan working set data mentah vs ringkasan.

Prasyarat #

Materi proyek ini bersumber dari Section:

  • Time Series dan Specialized Collections — chapter Time Series Collections, Desain Schema Time Series, Indexing Time Series, Querying Time Series, dan Capped Collections sebagai pembanding tipe collection.
  • Aggregation — $group, $dateTrunc dari Operator Tanggal, $setWindowFields dari Window Functions, dan $merge dari $merge dan $out.
  • Indexing — TTL index (prinsip expireAfterSeconds) dan Explain Query Plans untuk membaca rencana eksekusi.

Lingkungan pengerjaan sama seperti proyek sebelumnya: single-node replica set rs0 di 127.0.0.1:27017, diakses mongosh dengan connection string mongodb://127.0.0.1:27017/?directConnection=true.

Hasil Akhir #

Proyek menghasilkan database proyek_sensor berisi time series collection sensor_cuaca dengan 500 pengukuran dan collection ringkasan_harian hasil downsampling:

BerkasPeran
src/buat-collection.jsMereset database; membuat sensor_cuaca + verifikasi struktur
src/simpan-data.js500 pengukuran deterministik (4 sensor, interval 30 menit)
src/analisis-waktu.jsStatistik per sensor, per jam, tren, dan rentang waktu
src/retensi.jsTTL collMod (dengan bukti nyata) + downsampling $merge
src/uji-performa.jsexplain query rentang waktu + perbandingan working set
tests/semua-tes.jsSuite tes mandiri; mencetak SEMUA TES LULUS

Peta Bagian #

Proyek dikerjakan dalam empat bagian berurutan:

  1. Bagian 1 — Time Series Schema: mengapa collection biasa tidak cukup, dan bagaimana sensor_cuaca dibuat.
  2. Bagian 2 — Menyimpan Data: bentuk document pengukuran, generator deterministik, dan batch insert.
  3. Bagian 3 — Aggregation Berdasarkan Waktu: pipeline statistik, per jam, tren, dan rentang.
  4. Bagian 4 — Retention dan Performance: TTL nyata, downsampling, dan bukti index otomatis bekerja.

Menjalankan Kode Proyek #

Susun folder proyek berikut — setiap berkas diunduh dari bagian yang membahasnya:

text
pencatatan-data-waktu/
├── src/
│   ├── buat-collection.js
│   ├── simpan-data.js
│   ├── analisis-waktu.js
│   ├── retensi.js
│   └── uji-performa.js
└── tests/
    └── semua-tes.js

Dari folder pencatatan-data-waktu/, jalankan skrip sesuai urutan (skrip retensi.js memuat verifikasi TTL nyata sehingga berjalan sekitar satu setengah menit):

bash
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/buat-collection.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/simpan-data.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/analisis-waktu.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/retensi.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/uji-performa.js

Untuk mengulang dari awal, jalankan kembali buat-collection.js — database proyek_sensor direset seluruhnya. Suite tes berjalan mandiri kapan saja karena menyiapkan datanya sendiri di database proyek_sensor_tes:

bash
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file tests/semua-tes.js