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.
{
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:
Tiga bagian skrip ini yang paling penting:
mulberry32(20260101): generator acak semu dengan seed tetap — angka20260101menentukan seluruh deret nilai acak berikutnya. Ganti seed, seluruh dataset berubah; pertahankan seed, dataset identik selamanya.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 — mulai2026-01-01T00:00Z, satu titik tiap 30 menit, 125 titik per sensor — bukan “waktu sekarang”, agar hasil analisis tidak bergeser antar eksekusi.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:
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/simpan-data.jsOutput yang Dihasilkan:
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.