Glossary
BSON
İkili JSON, MongoDB'nin depolama biçimi
By Buğra SözeriPublished Updated
BSON (Binary JSON), MongoDB’nin depolama ve ağ üzerinden iletişim için kullandığı ikili kodlu veri biçimidir. API düzeyinde JSON şeklindedir — aynı nesne/dizi hiyerarşisi — ancak diskte ve ağda ikili biçimdedir.
JSON varken neden ikili bir biçim:
- Tür sadakati. JSON yalnızca string, number, boolean, null, object, array içerir. BSON Date, Binary, ObjectId, Decimal128, Regex, Timestamp, Int32 - Int64 ekler. BSON üzerinden gidiş-dönüşler tam türü korur.
- Kendi kendini açıklayan uzunluk başlıkları. Her BSON belgesi ve değeri kendi uzunluğuyla öne eklenerek MongoDB’nin onları ayrıştırmadan geçmesine olanak tanır. JSON baştan okumayı gerektirir.
- Ondalık aritmetik. BSON’un Decimal128 türü, 34 anlamlı basamağa kadar tam ondalık sayıları depolar — IEEE 754 float’ların kötü yuvarlama yaptığı finansal veriler için önemlidir.
BSON dosyaları genellikle eşdeğer JSON’dan %10-20 daha büyüktür; çünkü uzunluk başlıkları ve açık tür etiketleri içerir. Ancak MongoDB bir alanı bulmak için belgeyi ayrıştırmak zorunda kalmadığından sorgu performansı dramatik biçimde daha hızlıdır.
Çoğu MongoDB sürücüsü (Node, Python, Java, Go) BSON ile dilin yerel türleri arasında otomatik olarak dönüştürür. MongoDB dışında bir sürücü yazmıyorsanız veya bson yedek dosyalarını okumuyorsanız BSON ile doğrudan etkileşime nadiren girersiniz.
16 MB belge sınırı: tek bir BSON belgesi 16 megabaytı geçemez. Bu MongoDB sunucusunun sert bir kısıtlamasıdır, BSON spesifikasyon sınırı değil — biçim 32 bit işaretli uzunluklar kullanır ve teorik olarak 2 GB’a ulaşabilir. 16 MB sınırı aşırı kullanım durumlarına (bir belgede kitap veya görüntü ikilileri saklamak) karşı koruma sağlar ve tipik ağ paketi penceresinin boyutuyla eşleşir. Sınırı aşan belge büyümesi GridFS çözümünü (yükü birden fazla belgeye bölmek) ya da büyük ikililerin nesne depolama alanında, belgenin yalnızca bir referans tutacağı biçimde yeniden tasarımı zorunlu kılar.
BSON’un ObjectId’sinin neden UUID değil 12 bayt olduğu: MongoDB’nin varsayılan _id’si 4 baytlık Unix zaman damgası, 5 baytlık rastgele “süreç” tanımlayıcısı (eski makine-id/PID ayrımının yerini alır) ve 3 baytlık artan sayaçtan oluşan 12 baytlık bir ObjectId’dir. Yapı, zamansal sıralama sağlar (en yeni belgeler doğal olarak sona sıralanır) ve UUID4’ün koordinasyon maliyetini ortadan kaldırır. Değiş tokuşu UUID için 16 bayta karşı 12 bayttır; milyar belge üzerinde bu 4 GB birincil anahtar depolama tasarrufu sağlar. Yeni koleksiyonlar genellikle çapraz veritabanı uyumluluğu için UUID v7 kullanır. İlgili: IEEE 754, BigInt. Referans: BSON Spesifikasyonu.
Çalışılmış örnek
{"x": 1} JSON belgesi metin olarak 8 bayttır. Aynı belge BSON’da 0C 00 00 00 10 78 00 01 00 00 00 00 — 12 bayttır: 4 bayt toplam uzunluk, 1 bayt tür kodu (0x10 = int32), null ile sonlandırılan dize olarak alan adı x (2 bayt), tamsayı değeri için 4 bayt ve 1 bayt belge sonlandırıcı. JSON küçük yükler için daha kısadır ancak BSON ayrıştırma hızı ve dize türü olmayan türler içeren belgeler söz konusu olduğunda kazanır. Gerçek dünyadan bir örnek: Decimal128 fiyat 123,45 ile finansal bir işlemin depolanması BSON üzerinden tam olarak gidiş-dönüş yapar; JSON üzerinden 123.45 float olur ve JavaScript’te 123,44999999999999 olarak geri gelebilir. Decimal128 gösterimi büyüklükten bağımsız olarak 16 bayttır.
Ne zaman ve neden önemlidir
MongoDB üzerine herhangi bir uygulama oluşturup para verisi saklıyorsanız, bunu JSON’a serileştirilen JavaScript Number olarak değil Decimal128 olarak saklamalısınız. Mongoose şemaları varsayılan olarak BSON’da double olan Number’ı kullanır; bu da 0.10 + 0.20 gibi fiyatlarda sessizce IEEE-754 yuvarlama sorununa yol açar. Aynısı tarihler için de geçerlidir: tarihleri dize olarak saklamak (“2026-01-15”) saat dilimi sınırları boyunca dizinlenebilir sıralamayı kaybettirir; BSON Date olarak saklamak milisaniye hassasiyeti korur ve aralık sorgularının B-ağacı dizinlerini verimli kullanmasına olanak tanır. Verileri MongoDB’ye veya dışına taşırken BSON tür bilgisini JSON ara aşamasından korumak için relaxed modu yerine mongoexport --jsonFormat=canonical kullanın. Referans: MongoDB Kılavuzu — BSON Türleri.
Frequently asked questions
- BSON nedir?
- BSON (Binary JSON), MongoDB'nin belgeleri depolamak ve iletmek için kullandığı ikili kodlu serileştirme biçimidir. JSON'u tarihler, ikili veri, ObjectId ve 64 bit tam sayılar gibi ek veri türleriyle genişletir; hızlı geçiş ve yerinde güncellemeler için tasarlanmıştır.
- BSON'un JSON'da bulunmayan hangi türleri destekler?
- BSON şunları ekler: Date (çıkış noktasından bu yana milisaniye cinsinden 64 bit), ObjectId (12 baytlık benzersiz kimlik), Int32, Int64, Decimal128 (kesin ondalıklar için), Binary, Düzenli İfade ve Undefined. JSON yalnızca string, number, boolean, null, array ve object içerir.
- BSON, JSON'dan daha az yer kaplar mı?
- Zorunlu değil — BSON her belgede alan adlarını ve tür bilgisini gömer; bu da onu genellikle sıkıştırılmış JSON'dan daha büyük yapar. Avantajı hızdadır: uzunluk önekli dizeler ve diziler O(1) boyut aramalarına olanak tanıyarak belgeyi yeniden serileştirmeden daha hızlı ayrıştırma ve yerinde alan güncellemesi sağlar.
- MongoDB ObjectId nedir ve nasıl oluşturulur?
- ObjectId, varsayılan _id olarak kullanılan 12 baytlık bir BSON değeridir. 4 baytlık Unix zaman damgası, 5 baytlık makinede ve süreçte benzersiz rastgele değer ve 3 baytlık artan sayaç kodlar; böylece oluşturma zamanına göre sıralanabilir ve merkezi koordinatör olmadan küresel olarak benzersiz olur.
Related
Published May 15, 2026 · Last reviewed May 31, 2026