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:

js
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:

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

Baca kembali document tersebut untuk melihat bentuk utuhnya:

js
db.sampel.findOne()

Output yang Dihasilkan:

text
{
  _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:

AspekJSONBSON
BentukTeks yang bisa dibaca manusiaByte biner
Tipe data6 tipe dasar+ Date, ObjectId, Int32, Int64, Double, Decimal128, Binary, Timestamp, dan lainnya
Presisi angkanumber tunggal, presisi mengikuti parserTerpisah tegas antara int, long, double, decimal
Spesifikasijson.orgbsonspec.org
Penggunaan di MongoDBTampilan shell, ekspor/imporProtokol 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:

js
db.hello().maxBsonObjectSize

Output yang Dihasilkan:

text
16777216

Angka 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:

js
JSON.stringify(db.sampel.findOne())

Output yang Dihasilkan:

text
{"_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:

js
EJSON.stringify(db.sampel.findOne(), null, 2)

Output yang Dihasilkan:

text
{
  "_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:

js
db.dropDatabase()

Output yang Dihasilkan:

text
{ 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 $oid dan $date.

Dengan format penyimpanan yang jelas, kita siap membedah isi document itu sendiri — pasangan field-value, nested documents, dan arrays — di Chapter berikutnya.