MongoDB menyimpan setiap data dalam bentuk dokumen (document), yaitu unit data berupa pasangan field dan nilai yang strukturnya mengikuti JSON. Topik ini membedah anatomi dokumen MongoDB, mulai dari field dan nilai, objek bersarang, hingga array. Setelah membacanya, dokumen dengan struktur bertingkat apa pun pada jalur ini dapat dibaca dan ditafsirkan dengan tepat.
Struktur dasar dokumen#
Dokumen MongoDB ditulis di antara sepasang kurung kurawal, dan di dalamnya terdapat nol atau lebih pasangan field dan nilai yang dipisahkan tanda koma. Nama field berupa string, sedangkan nilainya boleh berupa tipe apa pun yang didukung MongoDB, mulai dari bilangan, teks, nilai logika, dokumen lain, hingga array. Bentuk ini mewarisi keterbacaan JSON, tetapi dokumen MongoDB bukan JSON murni karena tipe nilainya lebih beragam. Perbedaan keduanya dibahas pada topik tentang BSON, yaitu format biner yang dipakai MongoDB untuk menyimpan dokumen.
Diagram berikut membedah contoh dokumen mahasiswa menjadi bagian-bagiannya.
Pada diagram tersebut, nama dan usia adalah field dengan nilai tunggal, alamat adalah field yang nilainya berupa objek bersarang, sedangkan matkul adalah field yang nilainya berupa array. Setiap field sebaiknya memiliki nama yang unik di dalam satu dokumen, dan penamaannya hanya berupa string biasa tanpa persyaratan khusus. Data yang beragam tipe dapat hidup berdampingan dalam satu dokumen karena tipe disimpan bersama nilainya.
Field dan nilai#
Struktur dokumen paling mudah diamati dengan menyisipkannya ke sebuah koleksi, kemudian membacanya kembali. Blok berikut menyisipkan satu dokumen ke koleksi mahasiswa pada basis data akademik. Perintah use di awal hanya menetapkan basis data aktif, sedangkan sisipan dilakukan oleh insertOne.
use akademik
db.mahasiswa.insertOne({ nama: "Ali", usia: 20, aktif: true, ipk: null })switched to db akademik
{
acknowledged: true,
insertedId: ObjectId('6ae85f2e93aa58bb76ce5f47')
}Balasan insertOne berisi acknowledged yang menandakan operasi tulis diterima server, serta insertedId yang berasal dari field _id. Field _id ditambahkan server secara otomatis karena dokumen yang dikirim tidak membawanya. Field ini menjadi identitas dokumen di dalam koleksinya, wajib unik, dan tidak dapat diubah setelah dokumen dibuat. Baca kembali dokumen tersebut dengan findOne untuk melihat bentuk akhirnya.
db.mahasiswa.findOne(){
_id: ObjectId('6ae85f2e93aa58bb76ce5f47'),
nama: 'Ali',
usia: 20,
aktif: true,
ipk: null
}Pada keluaran tersebut, _id tampil di posisi pertama, sedangkan field lainnya mengikuti urutan saat ditulis. Server selalu menempatkan _id lebih dahulu dan mempertahankan urutan field sisanya. Nilai null pada field ipk berarti field itu ada tetapi sengaja dikosongkan, berbeda dengan field yang tidak ditulis sama sekali.
Objek bersarang#
Nilai sebuah field boleh berupa dokumen lain, dan bentuk ini disebut objek bersarang, atau embedded document dalam dokumentasi resmi. Objek bersarang berperilaku sama seperti dokumen biasa, yaitu berisi pasangan field dan nilai sendiri, dan dapat memuat objek bersarang lain hingga batas 100 tingkat kedalaman. Struktur ini memungkinkan data yang saling berkaitan erat hidup dalam satu dokumen, misalnya alamat lengkap seorang mahasiswa.
Field di dalam objek bersarang dijangkau lewat jalur titik (dot notation), yaitu nama field luar diikuti tanda titik dan nama field dalam. Jalur itu juga dipakai pada query untuk mencocokkan isi objek bersarang, sebagaimana blok berikut.
db.mahasiswa.insertOne({ nama: "Dewi", alamat: { jalan: "Jl. Merdeka 10", kota: "Bandung" } })
db.mahasiswa.find({ "alamat.kota": "Bandung" }){
acknowledged: true,
insertedId: ObjectId('6ae85f2e93aa58bb76ce5f48')
}
[
{
_id: ObjectId('6ae85f2e93aa58bb76ce5f48'),
nama: 'Dewi',
alamat: { jalan: 'Jl. Merdeka 10', kota: 'Bandung' }
}
]Query di atas mencocokkan dokumen yang jalur alamat.kota-nya bernilai Bandung, dan hanya dokumen Dewi yang lolos. Jalur titik ditulis sebagai string yang diberi tanda kutip karena tanpa kutip, JavaScript membaca alamat.kota sebagai akses properti pada variabel alamat yang tidak ada. Penulisan dengan kutip menjadikan seluruh jalur itu satu nama field utuh untuk dicocokkan server.
Array sebagai nilai#
Nilai field juga boleh berupa array, yaitu deretan nilai yang urutannya dipertahankan. Isi array boleh campuran tipe, tetapi array yang elemennya bertipe sama lebih mudah diquery dan lebih mudah dibaca. Elemen array boleh berupa objek bersarang, sehingga satu dokumen mampu memuat daftar bertingkat seperti daftar mata kuliah beserta detailnya.
db.mahasiswa.insertOne({ nama: "Citra", matkul: [ "Basis Data", "Pemrograman Web" ], nilai: [ { kode: "BD1", sks: 3 }, { kode: "PW2", sks: 2 } ] })
db.mahasiswa.findOne({ nama: "Citra" }){
acknowledged: true,
insertedId: ObjectId('6ae85f2e93aa58bb76ce5f49')
}
{
_id: ObjectId('6ae85f2e93aa58bb76ce5f49'),
nama: 'Citra',
matkul: [ 'Basis Data', 'Pemrograman Web' ],
nilai: [ { kode: 'BD1', sks: 3 }, { kode: 'PW2', sks: 2 } ]
}Field matkul berupa array string sederhana, sedangkan field nilai berupa array yang setiap unsurnya berupa objek bersarang. Kedua bentuk itu tetap dijangkau dengan jalur titik, bahkan untuk menjangkau field di dalam elemen array. Blok berikut mencocokkan dokumen yang salah satu elemen nilai memiliki field sks bernilai 3.
db.mahasiswa.find({ "nilai.sks": 3 })[
{
_id: ObjectId('6ae85f2e93aa58bb76ce5f49'),
nama: 'Citra',
matkul: [ 'Basis Data', 'Pemrograman Web' ],
nilai: [ { kode: 'BD1', sks: 3 }, { kode: 'PW2', sks: 2 } ]
}
]Jalur nilai.sks menelusuri setiap elemen array nilai, dan dokumen Citra lolos karena elemen pertama array nilai memuat field sks bernilai 3. Mekanisme yang sama berlaku untuk array sederhana, misalnya query pada matkul dengan nilai "Basis Data" mencocokkan dokumen yang arraynya memuat elemen itu. Dengan field tunggal, objek bersarang, dan array, satu dokumen sudah cukup memuat data yang pada model relasional tersebar di beberapa tabel.
Ringkasan#
- Dokumen MongoDB berupa pasangan field dan nilai di dalam kurung kurawal, dengan nama field berupa string dan nilai bertipe bebas.
- Nilai boleh berupa objek bersarang atau array, dan keduanya tetap dijangkau lewat jalur titik seperti
"alamat.kota"atau"nilai.sks". - Server menambahkan field
_idsecara otomatis bila dokumen tidak membawanya, menempatkannya di posisi pertama, dan menjadikannya identitas unik dokumen. - Urutan field dipertahankan sebagaimana ditulis, kecuali
_idyang selalu ditempatkan lebih dahulu.
Referensi#
- Documents — MongoDB Manual — Struktur dokumen, aturan field, dan batasan dokumen pada manual resmi MongoDB.
- BSON Types — MongoDB Manual — Daftar tipe nilai yang sah sebagai nilai field dokumen.