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, dancommentsbeserta relasinya — kategori dipakai sebagai referensi, penulis tetap embedded. - Mengelola alur tulis-terbit: artikel dimulai sebagai draf, lalu diterbitkan dengan
published_atyang menjadi dasar urutan tampil. - Menerapkan subset pattern: 10 komentar terbaru disematkan di artikel, seluruh komentar tersimpan lengkap di collection
comments, dan$lookupmenyatukan 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/$slicepada Bagian 2 dan 3. - Aggregation — stage
$lookupdan$projectuntuk 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:
| Berkas | Peran |
|---|---|
src/blog-seed.js | Mereset database; 3 kategori, 11 artikel, index unik slug |
src/blog-artikel.js | Alur tulis draf → terbitkan → tampilkan per kategori |
src/blog-comments.js | Subset pattern untuk comments + $lookup |
src/blog-pagination.js | Index pagination + perulangan halaman keyset |
tests/semua-tes.js | Suite tes mandiri; mencetak SEMUA TES LULUS |
Peta Bagian #
- Bagian 1 — Merancang Collections: menetapkan pola akses, relasi antar collection, strategi
_id, lalu mengisi data awal. - Bagian 2 — Artikel dan Kategori: alur penulisan dari draf sampai terbit beserta query tampilannya.
- Bagian 3 — Comments dan References: subset 10 komentar terbaru, collection penuh, dan penggabungan
$lookup. - 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:
blog-dengan-mongodb/
├── src/
│ ├── blog-seed.js
│ ├── blog-artikel.js
│ ├── blog-comments.js
│ └── blog-pagination.js
└── tests/
└── semua-tes.jsDari folder blog-dengan-mongodb/, jalankan skrip sesuai urutan:
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.jsUntuk 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:
mongosh "mongodb://127.0.0.1:27017/?directConnection=true" --file tests/semua-tes.jsRancang collection artikel dan kategori beserta relasinya.
Buka → # Bagian 2: Artikel dan KategoriImplementasikan penyimpanan dan penampilan artikel per kategori.
Buka → # Bagian 3: Comments dan ReferencesKelola comments dengan pola references dan $lookup.
Buka → # Bagian 4: Pagination dan IndexingTerapkan pagination stabil dan index untuk daftar artikel.
Buka →