Sistem pencatatan hanya sebaik data yang masuk — dan data yang masuk harus punya dua sifat: bentuk yang konsisten dan hasil yang dapat diulang. Bagian ini mengisi sensor_cuaca dengan 500 pengukuran dari empat sensor. Angka-angkanya dibangkitkan generator seeded, sehingga setiap eksekusi skrip menghasilkan dataset yang identik — suhu Jakarta jam 01:00 hari pertama akan sama berapa kali pun skrip dijalankan. Determinisme semacam ini bukan trik kosmetik: ia membuat analisis pada Bagian 3 dan suite tes pada Bagian 4 dapat membandingkan angka secara pasti.

Bentuk Document Pengukuran #

Satu pengukuran memuat empat hal: waktu kejadian di ts, identitas seri di sensor, dan dua nilai terukur. Tidak ada _id yang kita tulis — itu urusan MongoDB.

text
{
  ts: <Date>,                          // waktu kejadian (timeField)
  sensor: {                            // identitas seri (metaField)
    sensor_id: "JKT-01",
    kota: "Jakarta",
  },
  suhu: 27.5,                          // nilai terukur (di luar metaField)
  kelembapan: 82,
}

Perhatikan penempatannya: sensor_id dan kota stabil sepanjang hidup seri sehingga layak menjadi meta; suhu dan kelembapan berubah tiap titik sehingga wajib di luar. Kesalahan klasik pemula adalah memasukkan nilai terukur ke metaField — akibatnya bucket pecah menjadi satu per pengukuran.

Skrip Penulisan #

Skrip simpan-data.js membangun seluruh 500 document di memori lalu menyisipkannya sekali jalan:

js

Tiga bagian skrip ini yang paling penting:

  1. mulberry32(20260101): generator acak semu dengan seed tetap — angka 20260101 menentukan seluruh deret nilai acak berikutnya. Ganti seed, seluruh dataset berubah; pertahankan seed, dataset identik selamanya.
  2. buatPengukuran(sensor, i): suhu mengikuti siklus harian (puncak 14:00, terendah 02:00 lewat kosinus) plus derau kecil; kelembapan bergerak berlawanan fase. Jendela waktunya tetap — mulai 2026-01-01T00:00Z, satu titik tiap 30 menit, 125 titik per sensor — bukan “waktu sekarang”, agar hasil analisis tidak bergeser antar eksekusi.
  3. insertMany(batch): 500 pengukuran masuk dalam satu operasi batch — pola yang tepat untuk sensor nyata yang mengirim data per periode.

Jalankan setelah buat-collection.js:

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

Output yang Dihasilkan:

text
pengukuran lama dihapus: 0
titik dimasukkan       : 500
total pengukuran       : 500
per sensor             :
   BDG-07 Bandung     125 titik
   JKT-01 Jakarta     125 titik
   SBY-12 Surabaya    125 titik
   YOG-03 Yogyakarta  125 titik
struktur satu pengukuran (findOne):
{
  ts: ISODate('2026-01-01T00:00:00.000Z'),
  sensor: {
    kota: 'Jakarta',
    sensor_id: 'JKT-01'
  },
  _id: ObjectId('6ad42cf8f7c2d16d2a5d52bd'),
  suhu: 27.5,
  kelembapan: 82
}

Empat sensor berbagi karakter dasar yang berbeda — Surabaya terpanas (basis 31 °C), Bandung terdingin (basis 26 °C) — sehingga analisis Bagian 3 akan menampilkan pola yang mudah dibaca. Perhatikan juga findOne di akhir: field _id muncul di hasil baca meski tidak pernah kita tulis, dan ts tersimpan sebagai ISODate persis seperti yang dikirim.

Dataset siap. Bagian 3 mengolahnya menjadi informasi: statistik per sensor, pola per jam, tren, dan perbandingan rentang waktu.