MongoDB Academy · Ders

Aykırı Değer ve Ağaç Yapısı Desenleri

Öğrenenler, aykırı değer desenini kullanarak olağan dışı büyüklükte dizilere sahip belgeleri ele alacak ve üst başvuruları veya somutlaştırılmış yolları kullanarak hiyerarşik ağaç verilerini modelleyecektir.

4. ders / 413 adım

Aykırı Değer ve Ağaç Yapısı Desenleri, CoddyKit'te ücretsiz bir MongoDB Academy dersidir. Bu, 4 dersinin 4. 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.

Aykırı Değer Sorunu

MongoDB koleksiyonlarının çoğunda belgeler, öngörülebilir bir boyut dağılımını izler. Ancak zaman zaman normdan büyük ölçüde sapan aykırı değerler içeren belgelerle karşılaşırsınız. Viral hâle gelen bir sosyal medya gönderisinde, tipik gönderilerde 5–20 yorum varken 50.000 yorum birikebilir. Bir ünlünün beğendiği bir üründe 10.000 inceleme bulunabilir. Aykırı değerleri göz ardı ederek şemanızı ortalama duruma göre tasarlamak, sonunda 16 MB'lık belge boyutu sınırına ulaşan veya bellek baskısına neden olan belgeler oluşturur.

Aykırı Değer İçeren Belgeleri Belirleme

Aykırı değerlere göre tasarım yapmadan önce bunların verilerinizde gerçekten bulunup bulunmadığını belirleyin. Olağandışı büyüklükte diziler içeren belgeleri bulmak için bir toplulaştırma işlem hattı kullanın. Eşiği beklenen normal aralığınıza göre belirleyin: gönderilerin yüzde 99'unda 100'den az yorum varsa, 1.000'den fazla yorum içeren belgeler özel olarak ele alınmaya değer aykırı değerlerdir.

// Find posts with outlier-level comment counts
db.posts.aggregate([
  {
    $project: {
      title: 1,
      commentCount: { $size: { $ifNull: ['$comments', []] } }
    }
  },
  { $match: { commentCount: { $gt: 1000 } } },
  { $sort: { commentCount: -1 } },
  { $limit: 10 }
])

Aykırı Değer Deseni: Taşma İşareti

Aykırı Değer Deseni, dizileri bir eşiğe kadar gömerek normal durumu hızlı tutar; istisnai belgelerde ise hasOverflow işaretini ayarlar ve taşan öğeleri ayrı bir koleksiyonda depolar. Uygulama kodu işareti denetler: false ise (yaygın durum), gömülü diziyi kullanır. true ise (aykırı değer durumu), taşma koleksiyonuna ek bir sorgu gönderir.

// Normal post document (99% of posts)
{ _id: ObjectId(), title: 'Regular Post', comments: [/* up to 100 */], hasOverflow: false }

// Outlier post document
{
  _id: ObjectId(),
  title: 'Viral Post',
  comments: [/* first 100 comments */],
  hasOverflow: true  // more comments in overflow collection
}

// Overflow collection document
{ postId: ObjectId('...'), comments: [/* comments 101-5000 */] }

Aykırı Değer Deseniyle Okuma

Uygulama kodu, aykırı değer işaretini açıkça ele almalıdır. Çoğu zaman işaret false olur ve okumalar hızlı gerçekleşir. Aykırı değer içeren belgeler için ek taşma sorgusunu gerçekleştirin. Böylece yaygın işlem yolu en iyi duruma getirilirken istisnai durumlar doğru şekilde ele alınır; normal belgeler gereksiz yere büyümez ve 16 MB sınırına ulaşılmaz.

async function getPostWithComments(postId) {
  const post = await db.collection('posts').findOne({ _id: postId })

  if (!post.hasOverflow) {
    return post  // fast path — all comments embedded
  }

  // Outlier path — fetch additional comments from overflow
  const overflow = await db.collection('postOverflow').findOne({ postId })
  return {
    ...post,
    comments: [...post.comments, ...(overflow?.comments ?? [])]
  }
}

Ağaç Yapısı Desenlerine Giriş

Hiyerarşik veriler — ürün kategorileri, kuruluş şemaları, dosya sistemleri ve yorum dizileri — neredeyse her uygulamada bulunur. MongoDB'nin yerel bir ağaç veri türü yoktur; bu nedenle yapı, belge şemasında modellenmelidir. Her biri farklı sorgu erişim biçimleri için en iyi duruma getirilmiş dört yaygın ağaç deseni vardır: Üst Referansları, Alt Referansları, Atalar Dizisi ve Gerçekleştirilmiş Yollar.

Üst Referansları: Basit Hiyerarşi

Üst Referansı deseni, her düğümü, üst düğümünün _id değerini gösteren tek bir parent alanıyla depolar. Kök düğümlerde parent: null bulunur. Bu, en basit gösterimdir ve SQL iç içe küme veya komşuluk listesi ağaçlarının çalışma biçimini yansıtır. Bir düğümün doğrudan üstünü veya doğrudan alt düğümlerini bulmak için verimlidir; ancak birden çok düzeyde gezinmek için yinelemeli sorgular gerekir.

// Category tree with Parent References
db.categories.insertMany([
  { _id: 1, name: 'Electronics',   parent: null },
  { _id: 2, name: 'Phones',        parent: 1 },
  { _id: 3, name: 'Laptops',       parent: 1 },
  { _id: 4, name: 'Smartphones',   parent: 2 },
  { _id: 5, name: 'Feature Phones',parent: 2 }
])

// Find direct children of 'Electronics'
db.categories.find({ parent: 1 })

Atalar Dizisi: Hızlı Ata Araması

Atalar Dizisi deseni, kökten geçerli düğüme kadar olan tam yolu bir ancestors dizisinde depolar. Bu, "X, Y'nin atası mı?" sorusunu basit bir dizi üyeliği denetimiyle yanıtlamayı kolaylaştırır. Ayrıca bir düğümün tüm alt düğümlerini bulmayı da kolaylaştırır; bunun için ancestors dizisi o düğümün _id değerini içeren belgeleri sorgulayın. Bunun karşılığında, bir alt ağacı taşımak tüm alt düğüm belgelerinin güncellenmesini gerektirir.

// Array of Ancestors pattern
db.categories.insertMany([
  { _id: 1, name: 'Electronics',   ancestors: [] },
  { _id: 2, name: 'Phones',        ancestors: [1] },
  { _id: 4, name: 'Smartphones',   ancestors: [1, 2] }  // root→Electronics→Phones
])

// Find all descendants of Electronics (id=1)
db.categories.find({ ancestors: 1 })

// Check if Electronics is an ancestor of Smartphones
db.categories.findOne({ _id: 4, ancestors: 1 })  // not null = yes

Gerçekleştirilmiş Yollar: Dizi Tabanlı Ağaç

Gerçekleştirilmiş Yol deseni, tam yolu bir dizi olarak depolar (ör. '/Electronics/Phones/Smartphones'). Bir alt ağacın altındaki tüm düğümleri bulmak için ön ek sorgularını ve yol bölümleri içinde arama yapmak için düzenli ifade sorgularını mümkün kılar. Bu desen, dosya sistemi yollarına veya URL hiyerarşilerine doğal biçimde uyar. Hem ata araması hem de alt düğümleri listeleme için verimlidir; ancak düğümler yeniden adlandırıldığında veya taşındığında kırılgan olabilir.

// Materialised Path pattern
db.categories.insertMany([
  { _id: 1, name: 'Electronics', path: ',1,' },
  { _id: 2, name: 'Phones',      path: ',1,2,' },
  { _id: 4, name: 'Smartphones', path: ',1,2,4,' }
])

// Find all descendants of Phones (id=2) — path contains ',2,'
db.categories.find({ path: /,2,/ })

// Find the full path ancestors of Smartphones
db.categories.find({ _id: { $in: [1, 2] } })  // parse path and lookup ids

Doğru Ağaç Desenini Seçme

Ağaç desenini en sık gerçekleştirdiğiniz sorguya göre seçin: Üst Referansları — basittir, uygulama tarafında yinelemeyle gezinmek için uygundur; Alt Referansları — doğrudan alt düğümler dizisini gömer, tek bir düzeyi okumak için hızlıdır; Atalar Dizisi — ata araması ve alt ağaç sorguları için hızlı, taşıma işlemleri için maliyetlidir; Gerçekleştirilmiş Yollar — düzenli ifade tabanlı alt ağaç sorguları için hızlı, yeniden adlandırmalarda kırılgandır. Karma yaklaşımlar (hem üstü hem ataları depolamak), yazma karmaşıklığı karşılığında okuma hızını artırır.

Alt Referansları: Doğrudan Alt Düğümleri Gömme

Alt Referansları deseni, her düğüm belgesine doğrudan alt düğümlerin _id değerlerinden oluşan bir dizi gömer. Böylece tek bir okumayla bir düğümün tüm alt düğümlerini almak hızlanır (ayrı bir sorgu gerekmez). Sık sık yukarıdan aşağıya okunan ağaçlar için idealdir (ör. bir menü, alt öğelerini hemen görüntüler). Bunun karşılığında, geniş düğümlerde alt düğümler dizisi büyüyebilir ve ek bir dizin veya alan olmadan bir düğümün üstünü verimli şekilde bulamazsınız.

// Child References pattern
db.categories.insertMany([
  { _id: 1, name: 'Electronics', children: [2, 3] },
  { _id: 2, name: 'Phones',      children: [4, 5] },
  { _id: 3, name: 'Laptops',     children: [] },
  { _id: 4, name: 'Smartphones', children: [] },
  { _id: 5, name: 'Feature Phones', children: [] }
])

// Get direct children of Electronics in one read
const parent = db.categories.findOne({ _id: 1 })
const children = db.categories.find({ _id: { $in: parent.children } }).toArray()

Ağaçta Gezinmek İçin $graphLookup Kullanma

MongoDB'nin $graphLookup toplulaştırma aşaması, herhangi bir desenle depolanmış bir ağaçta veya grafikte gezinmek için referans alanlarını yinelemeli olarak izler. Belirtilen derinliğe kadar erişilebilen tüm düğümleri döndürür. Uygulama kodunda yinelemeli kod yazmadan hiyerarşilerde gezinmek için bunu Üst Referansları veya Alt Referansları ile kullanın. Döngüsel grafiklerde sonsuz döngüleri önlemek için maxDepth değerini belirtin.

// Traverse all descendants of Electronics using $graphLookup
db.categories.aggregate([
  { $match: { _id: 1 } },  // start from Electronics
  {
    $graphLookup: {
      from: 'categories',
      startWith: '$_id',
      connectFromField: '_id',
      connectToField: 'parent',
      as: 'descendants',
      maxDepth: 10
    }
  }
])

Hızlı Denetim

Bu dersteki MongoDB ve NoSQL veritabanı kavramlarını anlayıp anlamadığınızı sınayın.

Ders Özeti

Bu derste şunları öğrendiniz: Aykırı Değer Deseni, eşik değerine kadar dizileri gömerek ve istisnai belgeleri bir taşma koleksiyonuna yönlendirmek için hasOverflow işareti kullanarak normal belgeleri yalın tutar; ağaç yapısı desenlerinin (Üst Referansları, Atalar Dizisi, Gerçekleştirilmiş Yollar) her biri hiyerarşik verilerde farklı sorgu erişim biçimleri için en iyi duruma getirilmiştir; $graphLookup ise uygulama tarafında yineleme olmadan işlem hattındaki referanslar üzerinde yinelemeli olarak gezinir. Sırada MongoDB ile Redis'i belge ve anahtar-değer iş yükleri açısından karşılaştıracağı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

“Aykırı Değer ve Ağaç Yapısı Desenleri” dersi ücretsiz mi?

Evet — “Aykırı Değer ve Ağaç Yapısı Desenleri” 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.

“Aykırı Değer ve Ağaç Yapısı Desenleri” dersinde ne öğreneceğim?

Öğrenenler, aykırı değer desenini kullanarak olağan dışı büyüklükte dizilere sahip belgeleri ele alacak ve üst başvuruları veya somutlaştırılmış yolları kullanarak hiyerarşik ağaç verilerini modelley… 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 4. dersidir.

“Aykırı Değer ve Ağaç Yapısı Desenleri” 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. Bucket ve Hesaplanmış Değer Desenleri
  2. Genişletilmiş Başvuru ve Alt Küme Desenleri
  3. Polimorfik ve Şema Sürümleme Desenleri
  4. Aykırı Değer ve Ağaç Yapısı Desenleri
← MongoDB Academy Sayfasına Dön