Kita telah menempuh Section Aggregation dan Indexing konsep demi konsep. Proyek ini menggabungkan semuanya menjadi satu pekerjaan utuh: dashboard analitik penjualan toko buku — mengolah 2000 transaksi mentah menjadi omzet per kategori, peringkat produk, tren bulanan, dan laporan harian yang siap ditampilkan. Kita berperan sebagai analis data yang bekerja langsung dari terminal: merancang dataset, menyusun pipeline, membuktikan dampak index lewat explain, lalu mengemas hasilnya.

Seluruh kode proyek berbentuk skrip JavaScript yang dijalankan mongosh lewat opsi --file, sama seperti proyek-proyek sebelumnya. Fokus kita tetap pada bahasa query dan perancangan data — dua inti pekerjaan bersama MongoDB.

Tujuan Proyek #

Setelah menyelesaikan proyek ini, kita memiliki pipeline analitik dengan kemampuan berikut:

  • Dataset yang dapat direproduksi: 2000 transaksi sintetis dibangkitkan PRNG mulberry32 ber-seed tetap pada rentang 1 Januari – 30 Juni 2026, sehingga setiap angka laporan identik di setiap eksekusi.
  • Laporan inti: omzet per kategori, per bulan, dan harian dengan $dateTrunc; peringkat produk dengan kontribusi persentase; tren bulanan dengan $setWindowFields (delta dan rata-rata bergerak).
  • Pipeline yang terukur: index tanggal dan items.kategori + tanggal dibuktikan lewat output explain asli — COLLSCAN menjadi IXSCAN, lalu proyeksi tertutup yang tidak menyentuh collection sama sekali.
  • Keluaran siap tampil: dashboard multi-metriks satu pipeline $facet, laporan harian yang dimaterialisasi ke collection laporan_harian lewat $merge, tabel ASCII di terminal, dan jalur ekspor ke chart library.
  • Suite tes mandiri: 19 assertion memverifikasi konsistensi angka laporan terhadap perhitungan ulang sederhana — ditutup dengan SEMUA TES LULUS.

Prasyarat #

Proyek ini memakai materi dari Section Aggregation dan Indexing. Sebelum mulai, pastikan kita sudah memahami:

  • Aggregation — stage $match, $group, $unwind, dan $project (chapter Match, Group, Unwind), operator tanggal (Date Aggregation Operators), window function (Window Functions), hingga $facet dan $merge (Facet, Merge dan Out).
  • Indexing — cara kerja index (Mengapa Index Penting), compound dan multikey index, covered query, serta membaca explain (Explain Query Plans).
  • Administrasi ringan — cukup nyaman menjalankan skrip --file dari terminal.

Server yang dipakai adalah replika lingkungan Course: 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 selesai dengan satu database proyek_analitik berisi collection transaksi (2000 document, 4071 baris item, omzet Rp1.808.214.000), dua index, collection laporan_harian hasil materialisasi, dan lima skrip yang dapat dijalankan ulang kapan pun:

BerkasPeran
src/dataset-seed.jsMereset database dan membangkitkan 2000 transaksi deterministik
src/laporan-omzet.jsOmzet per kategori, per bulan, dan harian
src/laporan-produk.jsPeringkat produk, kontribusi persen, top-N
src/laporan-tren.jsDelta bulanan dan rata-rata bergerak 3 bulan
src/optimasi-index.jsDua index plus bukti explain sebelum/sesudah
tests/semua-tes.jsSuite tes mandiri; mencetak SEMUA TES LULUS

Seluruh berkas tersebut dapat diunduh lewat tombol unduhan pada code block di bagian yang membahasnya.

Peta Bagian #

Proyek dikerjakan dalam empat bagian berurutan — setiap bagian dibangun di atas dataset yang sama:

  1. Bagian 1 — Menyiapkan Dataset: merancang collection transaksi, memahami seed deterministik, lalu mengisi dan memeriksa dataset.
  2. Bagian 2 — Aggregation Pipeline: menyusun laporan omzet, produk, dan tren sambil membaca angkanya sebagai analis.
  3. Bagian 3 — Indexing dan Optimization: memasang dua index, membaca explain dan indexBounds, serta allowDiskUse.
  4. Bagian 4 — Menyajikan Hasil Analisis: dashboard $facet, materialisasi $merge, tabel ASCII, ekspor ke chart library, dan suite tes penutup.

Menjalankan Kode Proyek #

Buat folder proyek dengan struktur berikut — setiap berkas diunduh dari bagian yang sesuai:

text
dashboard-analitik/
├── src/
│   ├── dataset-seed.js
│   ├── laporan-omzet.js
│   ├── laporan-produk.js
│   ├── laporan-tren.js
│   └── optimasi-index.js
└── tests/
    └── semua-tes.js

Dari folder dashboard-analitik/, jalankan skrip sesuai urutannya:

bash
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/dataset-seed.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/laporan-omzet.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/laporan-produk.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/laporan-tren.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/optimasi-index.js

Untuk mengulang dari kondisi awal, cukup jalankan kembali dataset-seed.js — skrip tersebut mereset seluruh database proyek_analitik sebelum mengisi data. Suite tes dapat dijalankan kapan saja tanpa urutan karena tes menyiapkan datanya sendiri di database terpisah proyek_analitik_tes:

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