Manajemen inventaris memusatkan data pada satu collection; blog menuntut hal sebaliknya. Artikel, kategori, dan comments adalah tiga entitas dengan hubungan satu-ke-banyak yang hidup di collection berbeda, namun halaman depan situs hanya butuh potongan kecil dari masing-masing. Proyek kedua ini mengajak kita merancang relasi antar collection, menerapkan subset pattern untuk comments, lalu menutupnya dengan pagination yang tetap stabil ketika artikel terus bertambah.

Sama seperti proyek sebelumnya, seluruh kode berbentuk skrip mongosh yang dijalankan lewat --file. Kita tetap bekerja sepenuhnya dengan bahasa query dan perancangan data — tanpa kerangka aplikasi web.

Tujuan Proyek #

  • Merancang tiga collections: artikel, kategori, dan comments beserta relasinya — kategori dipakai sebagai referensi, penulis tetap embedded.
  • Mengelola alur tulis-terbit: artikel dimulai sebagai draf, lalu diterbitkan dengan published_at yang menjadi dasar urutan tampil.
  • Menerapkan subset pattern: 10 komentar terbaru disematkan di artikel, seluruh komentar tersimpan lengkap di collection comments, dan $lookup menyatukan keduanya.
  • Membangun pagination keyset: daftar artikel ditampilkan per halaman memakai kursor published_at + _id, didukung index compound tiga field.
  • Memverifikasi dengan suite tes mandiri yang mencetak SEMUA TES LULUS.

Prasyarat #

Materi yang dipakai proyek ini berasal dari Section berikut:

  • Data Modeling — chapter Relasi One-to-Many dan Subset Pattern, fondasi rancangan pada Bagian 1 dan 3.
  • Operasi CRUD — insertOne(), updateOne() dengan $set, $push, $unset, serta $each/$position/$slice pada Bagian 2 dan 3.
  • Aggregation — stage $lookup dan $project untuk menggabungkan artikel dan comments.
  • Indexing — chapter Index Ordering dan Compound Index yang menentukan bentuk index pagination pada Bagian 4.

Lingkungan pengerjaan sama dengan proyek pertama: server lokal rs0 di 127.0.0.1:27017 dan mongosh dengan connection string mongodb://127.0.0.1:27017/?directConnection=true.

Hasil Akhir #

Proyek menghasilkan database blog dengan tiga collections yang saling terhubung:

BerkasPeran
src/blog-seed.jsMereset database; 3 kategori, 11 artikel, index unik slug
src/blog-artikel.jsAlur tulis draf → terbitkan → tampilkan per kategori
src/blog-comments.jsSubset pattern untuk comments + $lookup
src/blog-pagination.jsIndex pagination + perulangan halaman keyset
tests/semua-tes.jsSuite tes mandiri; mencetak SEMUA TES LULUS

Peta Bagian #

  1. Bagian 1 — Merancang Collections: menetapkan pola akses, relasi antar collection, strategi _id, lalu mengisi data awal.
  2. Bagian 2 — Artikel dan Kategori: alur penulisan dari draf sampai terbit beserta query tampilannya.
  3. Bagian 3 — Comments dan References: subset 10 komentar terbaru, collection penuh, dan penggabungan $lookup.
  4. Bagian 4 — Pagination dan Indexing: kursor keyset dengan tie-breaker _id, index pendukung, dan suite tes penutup.

Menjalankan Kode Proyek #

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

text
blog-dengan-mongodb/
├── src/
│   ├── blog-seed.js
│   ├── blog-artikel.js
│   ├── blog-comments.js
│   └── blog-pagination.js
└── tests/
    └── semua-tes.js

Dari folder blog-dengan-mongodb/, jalankan skrip sesuai urutan:

bash
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/blog-seed.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/blog-artikel.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/blog-comments.js
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file src/blog-pagination.js

Untuk mengulang dari awal, jalankan kembali blog-seed.js — database blog direset seluruhnya. Suite tes berjalan mandiri kapan saja karena menyiapkan datanya sendiri di database blog_tes:

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