MongoDB 16MB Doküman Limiti Aşımı: Şişen Diziler (Unbounded Arrays), Antipattern'lar ve Bucket Deseni
Doküman içerisine sonsuz büyüyen alt diziler eklenmesi veya büyük ikili dosyaların GridFS yerine doğrudan saklanması sonucu oluşan 16MB hatasının tespiti ve Bucket/Outlier deseniyle çözümü.
Operasyonel Doğrulama & Güvenilirlik Standardı
Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.
▸Belirti
Dokümana yeni bir eleman eklenmeye çalışıldığında işlem doğrudan reddedilir:
MongoServerError: BSONObj size: 16793600 (0x1004000) is invalid. Size must be between 0 and 16793600(16MB)
MongoServerError: Document exceeds maximum allowed size of 16777216 bytes▸Sahada Ne Görürsün?
Kullanıcı dokümanına yorum, log veya bildirim eklendikçe belirli bir kullanıcı için $push işlemleri tamamen kilitlenir.
▸Kök Neden Matrisi
| Olasılık | Kök Neden | Açıklama |
|---|---|---|
| %70 | Şişen Dizi (Unbounded Array) Antipattern'ı | Dokümanın içerisine comments: [...] veya audit_logs: [...] şeklinde sonsuz büyüyen diziler yerleştirilmiştir. |
| %20 | İkili Veri (Binary/Image) Saklama | Profil fotoğrafı veya PDF'ler GridFS yerine Base64/Binary olarak doğrudan dokümana gömülmüştür. |
| %10 | Aşırı Detaylı İlişki Modellemesi | İlişkisel tablodaki 1-to-N bağıntısının N tarafı kontrolsüzce tek dokümana gömülmüştür. |
▸ACİL RUNBOOK (0-5dk)
// 1. Koleksiyondaki en büyük dokümanları ve boyutlarını bul
db.users.aggregate([
{ $project: { sizeBytes: { $bsonSize: "$$ROOT" } } },
{ $sort: { sizeBytes: -1 } },
{ $limit: 5 }
]);
// 2. 16MB sınırındaki dokümandan eski gereksiz elemanları temizle (ör. son 100 log'u tut)
db.users.updateOne(
{ _id: ObjectId("64f1a2b3c4d5e6f7a8b9c0d1") },
{ $push: { audit_logs: { $each: [], $slice: -100 } } }
);▸KALICI BLUEPRINT
- 1Bucket & Subset Deseni: Sonsuz büyüyen diziler ayrı koleksiyona (
user_audit_logs) referans verilerek taşınmalı; ana dokümanda sadece son 10 kayıt tutulmalıdır. - 2GridFS Kullanımı: 16MB sınırını aşabilecek dosya veya büyük JSON'lar için MongoDB GridFS kullanılmalıdır.
▸Doğrulama
db.users.aggregate([
{ $match: { _id: ObjectId("64f1a2b3c4d5e6f7a8b9c0d1") } },
{ $project: { sizeMB: { $divide: [{ $bsonSize: "$$ROOT" }, 1048576] } } }
]);Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
MongoDB "not master" / NotWritablePrimary Hatası
Failover sonrası "not master" hatasının nedeni, replicaSet içermeyen bağlantı dizesi, retryWrites ve election fırtınası teşhisi.
MongoDB E11000: Duplicate Key Error Teşhisi ve Çözümü
Aynı anahtara sahip iki dokümanın eşzamanlı eklenmesiyle oluşan E11000 hatasının tespiti, getIndexes denetimi ve $setOnInsert ile upsert desenleri.
MongoDB MongoNetworkError & HostUnreachable Teşhisi
Replica set primary düğümünün çökmesi, yanlış mongodb+srv dizesi ve ağ gecikmelerinde sürücünün bağlantı havuzunu temizlemesi; rs.status() ve kalıcı timeout ayarları.