MongoDB Academy · Ders

$setWindowFields ile Pencere İşlevleri

Öğrenenler, $setWindowFields aşamasını kullanarak sıralı bölümler üzerinde akan toplamları, sıralamayı ve hareketli ortalamaları hesaplayacaklardır.

4. ders / 413 adım

$setWindowFields ile Pencere İşlevleri, 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.

Pencere İşlevleri Nedir?

Pencere işlevleri, geçerli belgeyle ilişkili bir belge kümesi, yani bir 'pencere' üzerinde değerler hesaplar; ancak $group'ın yaptığı gibi belgeleri tek bir grupta birleştirmez. Bu işlevler SQL'de (SQL:2003) ortaya çıkmış ve MongoDB'ye 5.0 sürümünde $setWindowFields işlem hattı aşaması aracılığıyla eklenmiştir. Yaygın kullanım alanları arasında running total, moving average, sıralama ve kümülatif ölçümler bulunur.

$setWindowFields Aşamasının Yapısı

$setWindowFields aşamasının üç temel yapılandırma anahtarı vardır: partitionBy, belgelerin bağımsız pencerelere nasıl bölüneceğini tanımlar (SQL'deki GROUP BY gibi); sortBy, her bölüm içindeki belgeleri sıralar; output ise pencere işleci ve pencere sınırlarıyla birlikte hesaplanacak yeni alanları belirtir.

db.dailySales.aggregate([
  {
    $setWindowFields: {
      partitionBy: '$region',        // separate window per region
      sortBy: { saleDate: 1 },       // order by date within each region
      output: {
        runningTotal: {
          $sum: '$amount',
          window: { documents: ['unbounded', 'current'] }
        }
      }
    }
  }
])

Belge Tabanlı Pencere Sınırları

Pencere sınırları, her satır için hesaplamaya hangi belgelerin katkıda bulunacağını tanımlar. Belge tabanlı sınırlar, geçerli belgeye göre başlangıç ve bitiş konumlarını içeren iki öğeli bir diziyle birlikte documents anahtarını kullanır. 'unbounded', 'başlangıçtan itibaren (veya sona kadar)' anlamına gelir; 'current', geçerli belgeyi ifade eder; -1 gibi sayısal uzaklıklar ise 'geçerli belgeden bir önceki belge' anlamına gelir. Yaygın kalıplar: running total için ['unbounded', 'current'], 3 belgeli hareketli pencere için [-1, 1].

// Running total: all documents from the start up to the current row
window: { documents: ['unbounded', 'current'] }

// 3-document moving window: previous, current, and next document
window: { documents: [-1, 1] }

// Cumulative (all documents from start to end)
window: { documents: ['unbounded', 'unbounded'] }

Aralık Tabanlı Pencere Sınırları

Aralık tabanlı sınırlar, pencereyi belge uzaklıkları yerine sıralama anahtarındaki değer aralıklarını kullanarak tanımlar. Bu yaklaşım, 'son 7 belge' yerine 'son 7 gün' gibi bir aralık istediğiniz zaman serisi verileri için özellikle kullanışlıdır. Tarih alanları için birimle birlikte range anahtarını kullanın. Bu yöntem, günlerin eksik olabileceği veri boşluklarını doğru biçimde ele alır.

db.temperatures.aggregate([
  {
    $setWindowFields: {
      partitionBy: '$station',
      sortBy: { readingDate: 1 },
      output: {
        sevenDayAvgTemp: {
          $avg: '$temperature',
          window: {
            range: [-6, 0], // 6 days before up to current day
            unit: 'day'
          }
        }
      }
    }
  }
])

Running Total Hesaplama

Running total (kümülatif toplam), pencerenin bölümdeki ilk belgeden geçerli belgeye kadar uzanması sağlanarak hesaplanır. MongoDB her belgeyi sıralama sırasına göre işlerken, o belgenin değerini önceki tüm değerlere ekler. Böylece her bölüm için monotonik olarak artan bir toplam elde edilir; bu, kümülatif geliri veya aşamalı indirme sayılarını izlemek için kullanışlıdır.

db.transactions.aggregate([
  {
    $setWindowFields: {
      partitionBy: '$accountId',
      sortBy: { date: 1 },
      output: {
        runningBalance: {
          $sum: '$amount',
          window: { documents: ['unbounded', 'current'] }
        }
      }
    }
  },
  { $project: { accountId: 1, date: 1, amount: 1, runningBalance: 1 } }
])

Verileri Düzleştirmek İçin Moving Average

Moving average, zaman serisi verilerindeki kısa vadeli dalgalanmaları yumuşatarak temel eğilimleri ortaya çıkarır. Pencereyi her iki yönde sabit sayıda dönemi kapsayacak şekilde veya yalnızca geriye doğru, yani 'geriye dönük' bir ortalama oluşturacak şekilde yapılandırın. Moving average, finansal grafiklerde, performans izleme panolarında ve IoT sensör analizlerinde yaygın olarak kullanılır.

db.stockPrices.aggregate([
  {
    $setWindowFields: {
      partitionBy: '$ticker',
      sortBy: { date: 1 },
      output: {
        movingAvg5Day: {
          $avg: '$closePrice',
          window: { documents: [-4, 0] } // current + 4 previous = 5 day average
        },
        movingAvg10Day: {
          $avg: '$closePrice',
          window: { documents: [-9, 0] } // 10-day trailing average
        }
      }
    }
  }
])

$rank ve $denseRank ile Sıralama

$rank işleci, sıralama düzenine göre bölümü içindeki her belgeye bir sıra numarası atar. Eşit sıradaki belgeler aynı sırayı alır ve sonraki sıra buna göre atlanır (1, 2, 2, 4). $denseRank ise eşit sıralarda boşluk bırakmadan ardışık sıralar atar (1, 2, 2, 3). Her ikisi de pencere belirtimi almaz; her zaman bölümün tamamı üzerinde sıralama yapar.

db.leaderboard.aggregate([
  {
    $setWindowFields: {
      partitionBy: '$gameId',
      sortBy: { score: -1 }, // highest score = rank 1
      output: {
        rank: { $rank: {} },
        denseRank: { $denseRank: {} }
      }
    }
  },
  { $match: { rank: { $lte: 10 } } } // top 10 per game
])

$documentNumber: Bölüm İçinde Satır Numaralandırma

$documentNumber, sıralama düzeninde bölüm içindeki her belgeye 1'den başlayan ardışık bir tam sayı atar. $rank işlemcisinden farklı olarak sayıları hiçbir zaman tekrarlamaz; her belge benzersiz bir numara alır. Bu, sayfalama, sıra numarası verme veya bir belgenin bölüm içinde hangi satırda bulunduğunu belirleme gerektiğinde kullanışlıdır.

db.orders.aggregate([
  {
    $setWindowFields: {
      partitionBy: '$customerId',
      sortBy: { orderDate: 1 },
      output: {
        orderSequence: { $documentNumber: {} } // 1st order, 2nd order, etc.
      }
    }
  },
  // Find customers' 3rd orders
  { $match: { orderSequence: 3 } }
])

$shift: Komşu Belgelere Erişme

$shift, bölüm içinde geçerli belgeye göre belirtilen uzaklıktaki bir belgeden bir ifadenin değerini döndürür. Önceki belgenin değerine (örneğin dünkü fiyata) erişmek için by: -1, sonraki belge için by: 1 kullanın ve uzaklık bölüm sınırlarının dışına çıktığında kullanılacak bir default belirtin.

db.dailyMetrics.aggregate([
  {
    $setWindowFields: {
      partitionBy: '$metricName',
      sortBy: { date: 1 },
      output: {
        previousValue: {
          $shift: {
            output: '$value',
            by: -1,
            default: null
          }
        },
        // Compute day-over-day change using $shift
        dayOverDayChange: {
          $subtract: [
            '$value',
            { $shift: { output: '$value', by: -1, default: '$value' } }
          ]
        }
      }
    }
  }
])

Performans ve Dizin Kullanımı

$setWindowFields, bölüm ve sıralama alanlarındaki dizinlerden yararlanır. Hem bölüm anahtarını hem de sıralama anahtarını kapsayan bir dizin, MongoDB'nin her bölümün belgelerini tam koleksiyon taraması yapmadan sıralı biçimde verimli şekilde almasını sağlar. Dizin olmadığında MongoDB bellekte sıralama yapmalıdır (allowDiskUse sınırlarına kadar). Büyük koleksiyonlarda dizinlerin pencere işlevlerinizin bölüm ve sıralama belirtimleriyle uyumlu olduğundan emin olun.

// For this $setWindowFields:
// partitionBy: '$accountId', sortBy: { date: 1 }
// Create a compound index:
db.transactions.createIndex({ accountId: 1, date: 1 })
// MongoDB can now efficiently scan per-partition in date order

Uygulamalı Örnek: Satış Performansı Raporu

Gerçek dünyadaki bir satış raporunda, her satış temsilcisinin işlemlerine kümülatif toplamını, ekibi içindeki sırasını ve ekibin kümülatif toplamını eklemek gerekebilir. Bunların tümü, birden fazla birleştirme veya uygulama tarafında hesaplama yapılmadan tek bir işlem hattında hesaplanabilir. $setWindowFields tam olarak bu tür analitik sorgular için tasarlanmıştır.

db.sales.aggregate([
  {
    $setWindowFields: {
      partitionBy: '$teamId',
      sortBy: { amount: -1 },
      output: {
        rankInTeam: { $rank: {} },
        runningTeamTotal: {
          $sum: '$amount',
          window: { documents: ['unbounded', 'current'] }
        },
        teamTotal: {
          $sum: '$amount',
          window: { documents: ['unbounded', 'unbounded'] }
        }
      }
    }
  }
])

Hızlı Kontrol

Bu derste ele alınan MongoDB ve NoSQL Veritabanları kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: $setWindowFields, $group gibi belgeleri birleştirmeden ilişkili belgelerden oluşan kayan bir pencere üzerinde değerler hesaplar, belge tabanlı ve aralık tabanlı pencere sınırları her hesaplamaya hangi belgelerin katkıda bulunacağını belirler ve $rank, $denseRank, $documentNumber ve $shift gibi işleçler sıralama, numaralandırma ve satırlar arası karşılaştırmalar yapmayı sağlar. Sırada MongoDB'nin dağıtık belge deposundaki ACID garantilerini inceleyeceğiz.

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

“$setWindowFields ile Pencere İşlevleri” dersi ücretsiz mi?

Evet — “$setWindowFields ile Pencere İşlevleri” 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.

“$setWindowFields ile Pencere İşlevleri” dersinde ne öğreneceğim?

Öğrenenler, $setWindowFields aşamasını kullanarak sıralı bölümler üzerinde akan toplamları, sıralamayı ve hareketli ortalamaları hesaplayacaklardır. 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.

“$setWindowFields ile Pencere İşlevleri” 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. $sum, $avg, $min, $max: Sayısal Toplulaştırma
  2. $push ve $addToSet: Gruplarda Diziler Oluşturma
  3. $first, $last ve $top/$bottom Biriktiricileri
  4. $setWindowFields ile Pencere İşlevleri
← MongoDB Academy Sayfasına Dön