Mengupas hierarki data MongoDB dari database, collection, document, hingga field; memahami format BSON dan tipe data kaya di dalamnya; serta membedah field _id dan ObjectId 12-byte yang menjamin keunikan setiap dokumen.

Di episode 1 kalian memahami mengapa MongoDB ada dan kapan tepatnya dipakai. Sekarang saatnya masuk ke jantung sistem: bagaimana MongoDB menyusun dan menyimpan data. Tanpa pemahaman struktur ini, kalian akan menulis query yang kebetulan jalan tapi tidak pernah benar-benar paham apa yang terjadi di belakang layar.
Episode 2 adalah fondasi teknis yang paling penting di seluruh series. Roadmap-nya: pertama kita petakan hierarki data dari database hingga field, kedua kita bedah format BSON beserta tipe data kaya yang didukungnya, dan ketiga kita bongkar misteri _id dan ObjectId — penanda identitas setiap dokumen. Akhir episode, kalian akan bisa membayangkan dengan jelas bagaimana satu dokumen berwujud di dalam server MongoDB.
Sebagai orang yang terbiasa dengan RDBMS, cara termudah memahami MongoDB adalah lewat analogi. MongoDB memiliki empat tingkatan hierarki:
| Level MongoDB | Analogi RDBMS | Contoh |
|---|---|---|
| Database | Database | belajar |
| Collection | Table | users |
| Document | Row / Baris | Satu record user |
| Field | Column / Kolom | name, email |
Perbedaan besar ada di level Document vs Row: baris di RDBMS harus punya struktur kolom yang identik dengan baris lain, sementara dokumen di MongoDB boleh memiliki struktur berbeda-beda. Dan yang lebih penting — Collection tidak perlu dideklarasikan sebelumnya. Kalian bisa langsung menulis ke collection baru dan MongoDB akan membuatnya secara otomatis.
Database adalah wadah paling atas. Satu server MongoDB bisa memiliki banyak database. Kalian bisa melihat daftarnya dengan show dbs, dan berpindah atau masuk ke database dengan use:
use belajar
show dbs
dbdb menampilkan nama database yang sedang aktif. Catatan penting: database baru tidak akan terlihat di show dbs sampai ada satu dokumen pertama yang ditulis ke dalamnya — ini perilaku "lazy creation" khas MongoDB.
Collection adalah kumpulan dokumen, analog dengan tabel. Tapi berbeda dari tabel, collection tidak punya skema tetap. Document adalah unit data terkecil yang benar-benar disimpan — analog dengan baris, tapi berbentuk struktur JSON yang fleksibel. Untuk melihat koleksi yang ada:
show collections
db.users.countDocuments()Fungsi countDocuments menghitung jumlah dokumen dalam collection. Kalian akan sering memakai fungsi ini untuk cek cepat.
MongoDB tidak menyimpan dokumen sebagai teks JSON, melainkan sebagai BSON (Binary JSON) — representasi biner ter-encode dari JSON. Kenapa biner? Ada tiga alasan utama:
Date, Decimal128, Binary, ObjectId, dan UUID.Saat kalian menulis query di mongosh, kalian memang mengetik sintaks JSON-like — tapi di balik layar, semua diubah menjadi BSON sebelum disimpan. Berikut tipe data utama BSON yang perlu kalian kenal:
| Tipe BSON | Alias mongosh | Keterangan |
|---|---|---|
| String | "teks" | UTF-8 string |
| Int32 | NumberInt(5) | Integer 32-bit |
| Int64 | NumberLong(5) | Integer 64-bit |
| Double | 5.25 | Floating point |
| Boolean | true / false | Nilai logika |
| Date | ISODate("2026-08-03T00:00:00Z") | Waktu |
| ObjectId | ObjectId("66...") | Identitas unik 12-byte |
| Array | [1, 2, 3] | Daftar nilai |
| Embedded Document | { "address": { ... } } | Dokumen bersarang |
| Binary | BinData(0, "...") | Data biner |
| Decimal128 | NumberDecimal("19.99") | Presisi desimal tinggi |
| Null | null | Nilai kosong |
Dua tipe BSON paling sering menimbulkan bug di lapangan:
NumberDecimal — untuk uang, jangan pernah pakai Double. Perhitungan 0.1 + 0.2 di floating point menghasilkan 0.30000000000000004. Untuk nilai moneter, gunakan NumberDecimal:
db.products.insertOne({ name: "Tas", price: NumberDecimal("99.99") })
db.products.findOne()ISODate — tanggal di MongoDB selalu tersimpan sebagai UTC. Saat kalian memasukkan ISODate("2026-08-03T00:00:00Z"), MongoDB menyimpannya dalam UTC; konversi ke zona waktu lokal terjadi di sisi aplikasi.
Setiap dokumen MongoDB wajib memiliki field _id yang unik di dalam collection. Dua aturan penting:
_id saat insert, MongoDB otomatis membuatnya sebagai ObjectId._id sendiri, nilainya boleh apa saja (string, integer, UUID) asalkan unik di collection.db.users.insertOne({ _id: "user-001", name: "Arman" })
db.users.insertOne({ name: "Budi" })
db.users.find()Hasilnya: dokumen pertama punya _id: "user-001" sesuai yang kalian set, dokumen kedua mendapat _id ObjectId otomatis.
ObjectId adalah tipe default untuk _id. Panjangnya 12 byte, tersusun dari tiga bagian yang masing-masing punya makna:
| Byte | Isi | Makna |
|---|---|---|
| 1–4 | Timestamp (detik sejak epoch) | Kapan dokumen dibuat |
| 5–9 | Random value per-proses | Keunikan antar proses |
| 10–12 | Incrementing counter | Keunikan dalam proses yang sama |
Karena ada timestamp di dalamnya, kalian bisa mengekstrak waktu pembuatan dokumen langsung dari _id tanpa menyimpan field createdAt terpisah:
db.users.findOne()._id.getTimestamp()Kombinasi timestamp + random + counter membuat ObjectId unik tanpa perlu komunikasi antar server — ini penting untuk sistem terdistribusi di mana banyak server bisa membuat dokumen secara bersamaan tanpa bentrok.
Sekarang mari terapkan semua konsep dalam satu contoh nyata. Kita buat collection users dengan dokumen yang memanfaatkan rich BSON types:
db.users.insertOne({
name: "Arman Dwi Pangestu",
age: NumberInt(27),
email: "arman@example.com",
balance: NumberDecimal("2500.50"),
isActive: true,
registeredAt: ISODate("2026-08-03T08:30:00Z"),
tags: ["backend", "mongodb"],
address: {
city: "Jakarta",
country: "Indonesia"
}
})Perhatikan kombinasi tipe di dalam satu dokumen: string, Int32, Decimal128, boolean, Date, array, dan embedded document — semua hidup bersama dengan natural. Ini yang tidak mungkin dilakukan semudah ini di RDBMS.
Info
Gunakan db.users.findOne() untuk melihat dokumen yang baru saja disisipkan. Perhatikan bahwa _id muncul otomatis sebagai ObjectId, dan mongosh menampilkan NumberDecimal("2500.50") serta ISODate(...) dalam bentuk yang terbaca. Representasi ini persis nilai BSON yang tersimpan — bukan sekedar teks JSON.
Pada episode 2 ini kalian telah memahami hierarki data MongoDB: Database berisi Collection (analog tabel), yang berisi Document (analog baris) berisi Field (analog kolom). Kalian juga mengenal format BSON dan tipe data kaya di dalamnya — termasuk NumberDecimal untuk uang dan ISODate untuk waktu — serta memahami _id sebagai identitas wajib setiap dokumen dengan ObjectId 12-byte yang tersusun dari timestamp, random value, dan counter.
Inti yang harus dibawa pulang:
NumberDecimal untuk uang, Double untuk perhitungan biasa._id unik; ObjectId default 12-byte memuat timestamp.Di episode 3 berikutnya kita mulai menyentuh operasi nyata: Create & Read Operations. Kalian akan menulis insertOne, insertMany, dan bulkWrite untuk menyimpan data, lalu mengambilnya kembali dengan find, findOne, dan projection untuk mengontrol field yang dikembalikan. Sampai jumpa di episode 3, dan bersiaplah untuk menulis data pertama kalian ke MongoDB!