Setiap collection yang kita buat di Chapter sebelumnya menampung document — unit data terkecil sekaligus pusat seluruh model data MongoDB. Di layar mongosh, document tampak seperti JSON yang kita kenal dari JavaScript. Penampilan itu menyesatkan: yang dikirim lewat jaringan dan disimpan ke disk bukan teks JSON, melainkan BSON, format biner yang jauh lebih kaya tipenya. Pada Chapter ini kita bedah hubungan keduanya dan membuktikan sendiri perbedaannya lewat shell.
Yang akan kita bahas:
- Perbedaan mendasar JSON dan BSON: teks versus biner, tipe terbatas versus tipe kaya.
- Proses serialisasi: bagaimana objek di aplikasi menjadi byte di server.
- Batas ukuran document 16 MB dan cara mengeceknya dari shell.
- Extended JSON (EJSON) sebagai jembatan antara dunia JSON dan BSON.
JSON yang Tampak, BSON yang Tersimpan #
Document adalah sekumpulan pasangan field dan value yang ditulis di dalam kurung kurawal. Tampilkan satu document di mongosh, dan yang kita lihat memang mirip object JavaScript:
use latihan_bson
db.sampel.insertOne({
nama: "Kopi Gayo",
harga: 45000,
stok: NumberInt(12),
tersedia: true,
masukGudang: new Date("2026-10-17")
})Output yang Dihasilkan:
switched to db latihan_bson
{
acknowledged: true,
insertedId: ObjectId('6ad3806f2810ef306a770a31')
}Baca kembali document tersebut untuk melihat bentuk utuhnya:
db.sampel.findOne()Output yang Dihasilkan:
{
_id: ObjectId('6ad3806f2810ef306a770a31'),
nama: 'Kopi Gayo',
harga: 45000,
stok: 12,
tersedia: true,
masukGudang: ISODate('2026-10-17T00:00:00.000Z')
}Tampilan itu hanyalah rendering yang dibuat mongosh supaya nyaman dibaca manusia. Notasi ObjectId(...) dan ISODate(...) yang tercetak tidak ada dalam spesifikasi JSON murni — itu sinyal pertama bahwa di balik layar MongoDB memakai format lain.
JSON vs BSON #
JSON hanya mengenal enam tipe: string, number, boolean, null, object, dan array. BSON (kependekan dari Binary JSON) mempertahankan struktur yang sama tetapi menyandikannya sebagai byte biner dengan banyak tipe tambahan:
| Aspek | JSON | BSON |
|---|---|---|
| Bentuk | Teks yang bisa dibaca manusia | Byte biner |
| Tipe data | 6 tipe dasar | + Date, ObjectId, Int32, Int64, Double, Decimal128, Binary, Timestamp, dan lainnya |
| Presisi angka | number tunggal, presisi mengikuti parser | Terpisah tegas antara int, long, double, decimal |
| Spesifikasi | json.org | bsonspec.org |
| Penggunaan di MongoDB | Tampilan shell, ekspor/impor | Protokol kawat dan penyimpanan di disk |
Mengapa repot-repot memakai biner? Dua alasan utamanya. Pertama, BSON bisa menyimpan tipe yang tidak ada di JSON — tanggal, identifier unik, dan angka presisi tinggi tidak perlu “dipaksakan” menjadi string. Kedua, setiap elemen BSON menyimpan tipe dan panjangnya secara eksplisit, sehingga server dapat melompat dari satu field ke field lain tanpa mem-parsing seluruh isi document.
Perjalanan data dari aplikasi sampai disk disebut serialisasi:
Driver (Node.js, PyMongo, dan kawan-kawannya) mengubah objek bahasa pemrograman menjadi BSON sebelum mengirimnya ke server, lalu mengubah balasan BSON kembali menjadi objek. Mongosh melakukan hal yang sama di balik layar — itulah sebabnya kita bisa menulis objek JavaScript dan mendapatkan objek JavaScript kembali.
Batas 16 MB per Document #
Setiap document BSON dibatasi maksimum 16 MB (tepatnya 16.777.216 byte). Angka ini bukan sekadar dokumentasi; server melaporkannya secara langsung dan menolak document yang melebihinya:
db.hello().maxBsonObjectSizeOutput yang Dihasilkan:
16777216Angka 16777216 sama dengan 16 × 1024 × 1024 — informasi yang sudah pernah kita saksikan di field maxBsonObjectSize pada Chapter Verifikasi Instalasi. Batas ini menjaga memori dan performa server tetap terkendali: satu document harus cukup kecil untuk dimuat sekaligus. Untuk data besar seperti video atau file PDF, pola yang tepat adalah memecahnya menjadi banyak document, atau memakai GridFS — mekanisme bawaan MongoDB yang menyimpan file besar sebagai potongan-potongan 255 KB.
Melihat BSON Lewat EJSON #
Bagaimana membuktikan bahwa document kita memang bertipe lebih kaya daripada JSON? Cara termudah: paksa document tersebut melalui JSON.stringify() JavaScript dan lihat apa yang hilang:
JSON.stringify(db.sampel.findOne())Output yang Dihasilkan:
{"_id":"6ad3806f2810ef306a770a31","nama":"Kopi Gayo","harga":45000,"stok":12,"tersedia":true,"masukGudang":"2026-10-17T00:00:00.000Z"}Semua tipe BSON “turun kelas” menjadi teks: ObjectId menjadi string biasa, Date menjadi string berformat ISO, dan Int32 menyatu dengan number JavaScript. JSON tidak punya tempat untuk tipe-tipe itu.
Untuk kebutuhan ekspor dan pertukaran data, MongoDB mendefinisikan Extended JSON (EJSON) — dialek JSON yang menandai tipe BSON secara eksplisit:
EJSON.stringify(db.sampel.findOne(), null, 2)Output yang Dihasilkan:
{
"_id": {
"$oid": "6ad3806f2810ef306a770a31"
},
"nama": "Kopi Gayo",
"harga": 45000,
"stok": 12,
"tersedia": true,
"masukGudang": {
"$date": "2026-10-17T00:00:00Z"
}
}Perhatikan field seperti "$oid" dan "$date" pada hasilnya: itulah cara EJSON mempertahankan informasi tipe di dalam teks JSON. Tools seperti mongodump dan mongorestore memakai representasi ini, sehingga data yang diekspor tidak kehilangan tipe aslinya.
Sebagai penutup, bersihkan database latihan:
db.dropDatabase()Output yang Dihasilkan:
{ ok: 1, dropped: 'latihan_bson' }Rangkuman #
- Document tampak seperti JSON di shell, tetapi format aslinya adalah BSON biner (spesifikasi: bsonspec.org).
- BSON menambah tipe kaya di luar JSON:
Date,ObjectId,Int32,Int64,Double,Decimal128,Binary,Timestamp. - Serialisasi terjadi di driver: objek aplikasi → BSON → server, dan sebaliknya saat membaca.
- Satu document maksimum 16 MB (
maxBsonObjectSize= 16777216); data lebih besar dipecah atau memakai GridFS. JSON.stringify()menghilangkan tipe BSON; EJSON mempertahankannya lewat penanda seperti$oiddan$date.
Dengan format penyimpanan yang jelas, kita siap membedah isi document itu sendiri — pasangan field-value, nested documents, dan arrays — di Chapter berikutnya.