MongoDB Academy · Ders

Sınırsız Dizi Karşıt Kalıbı

Öğrenenler, gömmenin sınırsız büyüyen belgelere yol açtığı durumları belirleyecek ve şemayı bunun yerine başvurular kullanacak şekilde yeniden düzenleyecektir.

3. ders / 413 adım

Sınırsız Dizi Karşıt Kalıbı, CoddyKit'te ücretsiz bir MongoDB Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, MongoDB Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. MongoDB Academy kursu toplamda 4 dersten oluşur.

Sınırsız Dizi Nedir?

Sınırsız dizi, zaman içinde durmaksızın büyüyebilen bir belge içindeki dizi alanıdır. Şema tasarımınız bir dizinin herhangi bir üst sınır olmadan öğe biriktirmesine izin veriyorsa—örneğin tüm kullanıcı yorumlarını kullanıcı belgesinde veya tüm günlük kayıtlarını bir olay belgesinde saklıyorsanız—sınırsız dizi karşıt düzenine sahipsiniz demektir. Bu, en yaygın MongoDB tasarım hatalarından biridir.

16 MB Belge Boyutu Sınırı

MongoDB, belge boyutu için kesin bir 16 MB sınırı uygular. Sınırsız bir dizi, zaman içinde belgeyi büyütür. Tüm iletileri, tüm etkinlik günlük kayıtlarını veya tüm satın alma geçmişini gömen bir kullanıcı belgesi sonunda bu sınıra ulaşır. Sınıra ulaşıldığında ekleme işlemleri BSONObjectTooLarge hatasıyla başarısız olur ve şemayı yeniden düzenlemeden kurtarmanın sorunsuz bir yolu yoktur.

Klasik Karşıt Düzen Örneği

Bir kullanıcının tüm yorumlarını doğrudan kullanıcı belgesinin içine gömdüğünüzü düşünün. Her yeni yorum, comments dizisine bir öğe daha ekler. Etkin bir kullanıcı aylar içinde binlerce yorum yazabilir. Bu şema ilk bakışta zararsız görünür, ancak belgeyi sınırsız biçimde büyütür.

// ANTI-PATTERN: comments array grows forever
db.users.insertOne({
  _id: ObjectId('u1'),
  name: 'Alice',
  comments: [
    { postId: ObjectId('p1'), text: 'Great article!', createdAt: new Date() },
    { postId: ObjectId('p2'), text: 'I disagree...', createdAt: new Date() }
    // ... potentially thousands more
  ]
});

Sınıra Ulaşmadan Önce Performansın Düşmesi

16 MB'a ulaşmadan önce bile büyük belgeler performansa zarar verir. MongoDB, yalnızca tek bir alana ihtiyacınız olsa bile her işlemde belgenin tamamını belleğe okumalıdır. Gömülü on bin yorum içeren bir kullanıcı belgesi RAM ve G/Ç kaynaklarını boşa harcar. Ayrıca belge büyümesi, WiredTiger'ın belgeleri yeni depolama konumlarına taşımasına neden olur; bu da parçalanmaya ve yazma çoğaltmasına yol açar.

Sınırsız Dizilerin Neden Olduğu Dizin Şişmesi

MongoDB, dizine eklenmiş bir dizinin her öğesi için bir çok anahtarlı dizin girdisi oluşturur. On bin öğeye büyüyen bir dizide comments.text alanını dizine eklerseniz dizin, kullanıcı başına on bin girdi içerir. Bu durum dizini bellekte ve diskte şişirerek tüm koleksiyondaki dizin taramalarını yavaşlatır.

Şemanızdaki Karşıt Düzeni Belirleme

Herhangi bir dizi alanı için kendinize şu soruları sorun: (1) Bu dizi, iş tarafından belirlenmiş bir üst sınır olmadan büyüyebilir mi? (2) Bu dizideki veriler çoğunlukla sona ekleniyor ve nadiren bir kerede okunuyor mu? (3) Bu diziye sahip tek bir belge birkaç kilobaytı aşabilir mi? Bunlardan herhangi birine yanıtınız evetse, muhtemelen yeniden düzenlenmesi gereken sınırsız bir diziniz vardır.

Ayrı Bir Koleksiyona Yeniden Düzenleme

Doğru çözüm, büyüyen öğeleri kendi koleksiyonlarına taşımak ve bir başvuru saklamaktır. Her comment, yazarı gösteren bir userId alanına sahip kendi belgesi olur. Kullanıcı belgesi yalın kalır ve yorum koleksiyonu, hiçbir belge boyut sınırına ulaşmadan milyarlarca satıra büyüyebilir.

// FIXED: comments live in their own collection
db.comments.insertMany([
  { _id: ObjectId(), userId: ObjectId('u1'), postId: ObjectId('p1'), text: 'Great article!', createdAt: new Date() },
  { _id: ObjectId(), userId: ObjectId('u1'), postId: ObjectId('p2'), text: 'I disagree...', createdAt: new Date() }
]);

// User document stays small
db.users.findOne({ _id: ObjectId('u1') }); // no comments array

Alternatif Olarak Kova Düzeni

Bazen verimlilik için ilgili olayları birlikte gruplamak istersiniz; örneğin saatlik IoT sensör okumalarını. Kova düzeni, her zaman kovası için o döneme ait okumaları içeren gömülü bir diziyle birlikte bir belge oluşturur (ör. saat başına bir belge). Her kovanın boyutu zaman aralığıyla sınırlıdır; bu nedenle tek bir belge sınırsız biçimde büyümez. Bu düzen, zaman serisi ve analiz şemalarında yaygındır.

// Bucket pattern: one document per device per hour
db.sensorReadings.insertOne({
  deviceId: 'sensor-42',
  bucketStart: new Date('2024-01-01T09:00:00Z'),
  readings: [
    { ts: new Date('2024-01-01T09:00:10Z'), temp: 22.1 },
    { ts: new Date('2024-01-01T09:00:20Z'), temp: 22.3 }
    // bounded to at most ~60 readings per hour bucket
  ],
  count: 2
});

Uygulama Mantığıyla Dizi Boyutunu Sınırlama

Sınırlandırılmış kullanım durumları için—örneğin son 5 bildirimi göstermek üzere—başka bir yaklaşım, diziyi sabit bir azami uzunlukta tutmak için $push ile $slice kullanmaktır. Böylece dizi bilinen bir boyutu hiçbir zaman aşmaz. Yalnızca en yeni N öğe önemli olduğunda ve eski öğeler silinebileceğinde bu yaklaşım uygundur.

// Keep only the 5 most recent notifications
db.users.updateOne(
  { _id: ObjectId('u1') },
  {
    $push: {
      notifications: {
        $each: [{ message: 'New follower', createdAt: new Date() }],
        $slice: -5  // retain only the last 5 elements
      }
    }
  }
);

Üretimde Büyük Belgeleri Belirleme

Canlı bir koleksiyonda boyut sınırına yaklaşan belgeleri bulmak için toplama işlem hattını $bsonSize ile kullanın (MongoDB 4.4+). Bu ifade bir belgenin boyutunu bayt cinsinden döndürür ve üretimde bir hata oluşmadan önce şemayı yeniden düzenleme gerektiren durumları belirleyip önceliklendirmenizi sağlar.

// Find documents larger than 1 MB in the users collection
db.users.aggregate([
  {
    $project: {
      name: 1,
      docSize: { $bsonSize: '$$ROOT' }
    }
  },
  { $match: { docSize: { $gt: 1048576 } } },  // 1 MB
  { $sort: { docSize: -1 } }
]);

Doğru Yeniden Düzenleme Stratejisini Seçme

Sınırsız bir dizi belirlediğinizde yeniden düzenleme stratejinizi verilerin niteliğine göre seçin:

  • Ayrı koleksiyon + başvuru: bağımsız sorgular gerektiren veya binlerce öğeye büyüyebilecek veriler için
  • Kova düzeni: doğal bir zaman aralığına göre gruplanan, zaman sıralı olaylar için
  • $push + $slice: eski verilerin silinebileceği, sınırlandırılmış güncel öğe listeleri için
Üçü de belge şişmesini önler, ancak her biri farklı bir erişim düzenine uygundur.

Hızlı Kontrol

Bu dersteki MongoDB ve NoSQL Veritabanları kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: sınırsız diziler belgeleri 16 MB sınırının üzerine çıkarır; büyük gömülü diziler bellek israfına, dizin şişmesine ve yazma çoğaltmasına neden olur; çözümler arasında ayrı koleksiyonlar, kova düzeni veya $slice içeren sınırlandırılmış diziler bulunur. Sırada, gömme veya başvuru yöntemini sistematik biçimde seçmek için bir şema tasarımı karar çerçevesi oluşturacağız.

Başlamak ücretsiz

Yapay zeka eğitmeniyle JavaScript öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
30
Dersler
120

Sıkça Sorulan Sorular

“Sınırsız Dizi Karşıt Kalıbı” dersi ücretsiz mi?

Evet — “Sınırsız Dizi Karşıt Kalıbı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve MongoDB Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. MongoDB Academy kursu toplamda 4 dersten oluşur.

“Sınırsız Dizi Karşıt Kalıbı” dersinde ne öğreneceğim?

Öğrenenler, gömmenin sınırsız büyüyen belgelere yol açtığı durumları belirleyecek ve şemayı bunun yerine başvurular kullanacak şekilde yeniden düzenleyecektir. MongoDB Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

MongoDB Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te MongoDB Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Sınırsız Dizi Karşıt Kalıbı” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu MongoDB Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her MongoDB Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Gömme: Bire- Az İlişkileri
  2. Başvuru Verme: Bire-Çok ve Çoka-Çok
  3. Sınırsız Dizi Karşıt Kalıbı
  4. Şema Tasarımı Karar Çerçevesi
← MongoDB Academy Sayfasına Dön