BSON memberi tahu kita format penyimpanan; Chapter ini membedah isi-nya. Document adalah unit yang kita baca dan tulis setiap hari — memahami anatominya sejak awal menyelamatkan kita dari kebingungan belakangan hari, karena query, update, dan perancangan model data semuanya merujuk pada struktur yang sama: pasangan field dan value yang membentuk pohon.

Peta materi Chapter ini:

  • Anatomi dasar: pasangan field: value di dalam kurung kurawal.
  • Menyusun document nyata dengan nested document dan array.
  • Mengakses nilai dengan dot notation dan kurung siku.
  • Field _id yang ditambahkan otomatis pada setiap document.

Pasangan Field dan Value #

Document dibangun dari pasangan field: value yang dipisahkan koma dan dibungkus kurung kurawal { }. Field adalah nama label, value adalah data — dan value boleh berupa tipe BSON apa pun, termasuk document lain atau array. Kita mulai dengan satu document peserta yang menggabungkan semuanya:

js
use latihan_struktur
db.peserta.insertOne({
  nama: "Siti Rahma",
  usia: 28,
  aktif: true,
  alamat: {
    jalan: "Jl. Merdeka No. 10",
    kota: "Bandung",
    kodePos: "40115"
  },
  hobi: ["membaca", "fotografi", "berkebun"]
})

Output yang Dihasilkan:

text
switched to db latihan_struktur
{
  acknowledged: true,
  insertedId: ObjectId('6ad380777d655807491b041f')
}

Mari kita bedah strukturnya baris per baris:

  1. nama, usia, aktif — tiga field dengan value sederhana: string, angka, dan boolean.
  2. alamat — field yang bernilai nested document: document di dalam document, ditandai kurung kurawal sendiri.
  3. hobi — field yang bernilai array: daftar nilai dalam kurung siku, di sini bertipe string semua.

Baca kembali document tersebut:

js
const p = db.peserta.findOne()
p

Output yang Dihasilkan:

text
{
  _id: ObjectId('6ad380777d655807491b041f'),
  nama: 'Siti Rahma',
  usia: 28,
  aktif: true,
  alamat: { jalan: 'Jl. Merdeka No. 10', kota: 'Bandung', kodePos: '40115' },
  hobi: [ 'membaca', 'fotografi', 'berkebun' ]
}

Tiga hal penting langsung terlihat pada hasilnya. Pertama, field _id muncul paling depan padahal kita tidak menuliskannya — MongoDB menambahkannya otomatis sebagai primary key. Kedua, urutan field persis seperti yang kita tulis: BSON mempertahankan urutan penulisan. Ketiga, nested document dan array diringkas mongosh ke satu baris — tampilan ringkas, tetapi strukturnya tetap pohon.

Dua aturan kecil yang perlu diingat sekarang: nama field bersifat case-sensitive (Nama dan nama adalah dua field berbeda), dan satu document tidak boleh memiliki dua field dengan nama yang sama persis — di mongosh hal ini otomatis terjaga karena object JavaScript memang tidak memperbolehkan kunci ganda.

Mengakses Nilai dengan Dot Notation dan Kurung Siku #

Document yang tersimpan di server hanyalah data; untuk bekerja dengannya di shell, kita membacanya sebagai object JavaScript. Field tingkat atas diakses cukup dengan titik:

js
p.nama
p.usia

Output yang Dihasilkan:

text
Siti Rahma
28

Field yang bernilai document bisa diambil utuh, lalu ditelusuri lebih dalam dengan dot notation berantai:

js
p.alamat
p.alamat.kota
p["alamat"]["kodePos"]

Output yang Dihasilkan:

text
{ jalan: 'Jl. Merdeka No. 10', kota: 'Bandung', kodePos: '40115' }
Bandung
40115

p.alamat mengembalikan nested document secara utuh, sedangkan p.alamat.kota menyelam satu level untuk mengambil nilai 'Bandung'. Bentuk kurung siku p["alamat"]["kodePos"] memberikan hasil yang sama — berguna saat nama field tersimpan di variable atau memuat karakter khusus.

Array memakai indeks posisi yang dimulai dari nol:

js
p.hobi
p.hobi[0]
p["hobi"][2]
p.hobi.length

Output yang Dihasilkan:

text
[ 'membaca', 'fotografi', 'berkebun' ]
membaca
berkebun
3

p.hobi[0] mengambil elemen pertama 'membaca', p["hobi"][2] mengambil elemen ketiga 'berkebun', dan .length melaporkan jumlah elemen array. Perhatikan bahwa mengakses indeks di luar jangkauan — misalnya p.hobi[5] — mengembalikan undefined, bukan galat.

Field _id Otomatis #

Setiap document di MongoDB wajib memiliki field _id yang nilainya unik di dalam collection-nya. Jika kita tidak menyertakannya saat insert, _id berupa ObjectId baru dibuatkan otomatis dan ditempatkan sebagai field pertama — persis seperti yang kita lihat pada p di atas. Nilai _id tidak harus ObjectId; kita bebas memakai string, angka, atau tipe lain sebagai kunci, dan itu akan dibahas tuntas di Chapter ObjectId.

Karena _id juga field biasa, aksesnya mengikuti aturan yang sama:

js
p._id
typeof p._id

Output yang Dihasilkan:

text
ObjectId('6ad380777d655807491b041f')
object

Sebagai penutup, bersihkan database latihan:

js
db.dropDatabase()

Output yang Dihasilkan:

text
{ ok: 1, dropped: 'latihan_struktur' }

Rangkuman #

  • Document adalah kumpulan pasangan field: value dalam kurung kurawal; urutan field dipertahankan BSON.
  • Value bisa tipe BSON apa pun — termasuk nested document (alamat) dan array (hobi).
  • Akses nilai: dot notation untuk field (p.alamat.kota), indeks untuk array (p.hobi[0]), kurung siku sebagai alternatif (p["alamat"]["kodePos"]).
  • Field _id wajib dan unik; tanpa explicit _id, server menambahkan ObjectId otomatis di posisi pertama.
  • Nama field case-sensitive dan tidak boleh ganda dalam satu document.

Struktur sudah jelas; dua Chapter berikutnya memperdalam dua komponen penyusunnya — aturan penamaan field beserta ragam value, dan anatomi ObjectId yang menjadi _id bawaan.