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_cuacadengantimeField: "ts",metaField: "sensor", dangranularity: "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
expireAfterSecondslewatcollMod(dibuktikan nyata menghapus data) dan downsampling menjadiringkasan_harianlewat$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,$dateTruncdari Operator Tanggal,$setWindowFieldsdari Window Functions, dan$mergedari $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:
| Berkas | Peran |
|---|---|
src/buat-collection.js | Mereset database; membuat sensor_cuaca + verifikasi struktur |
src/simpan-data.js | 500 pengukuran deterministik (4 sensor, interval 30 menit) |
src/analisis-waktu.js | Statistik per sensor, per jam, tren, dan rentang waktu |
src/retensi.js | TTL collMod (dengan bukti nyata) + downsampling $merge |
src/uji-performa.js | explain query rentang waktu + perbandingan working set |
tests/semua-tes.js | Suite tes mandiri; mencetak SEMUA TES LULUS |
Peta Bagian #
Proyek dikerjakan dalam empat bagian berurutan:
- Bagian 1 — Time Series Schema: mengapa collection biasa tidak cukup, dan bagaimana
sensor_cuacadibuat. - Bagian 2 — Menyimpan Data: bentuk document pengukuran, generator deterministik, dan batch insert.
- Bagian 3 — Aggregation Berdasarkan Waktu: pipeline statistik, per jam, tren, dan rentang.
- 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:
pencatatan-data-waktu/
├── src/
│ ├── buat-collection.js
│ ├── simpan-data.js
│ ├── analisis-waktu.js
│ ├── retensi.js
│ └── uji-performa.js
└── tests/
└── semua-tes.jsDari folder pencatatan-data-waktu/, jalankan skrip sesuai urutan (skrip retensi.js memuat verifikasi TTL nyata sehingga berjalan sekitar satu setengah menit):
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.jsUntuk 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:
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file tests/semua-tes.jsRancang time series collection untuk data sensor.
Buka → # Bagian 2: Menyimpan DataImplementasikan penulisan data sensor secara berkala.
Buka → # Bagian 3: Aggregation Berdasarkan WaktuAnalisis rata-rata dan tren per rentang waktu.
Buka → # Bagian 4: Retention dan PerformanceAtur retensi data dan pastikan query tetap cepat.
Buka →