Zaman Serilerinde Pencereli Toplulaştırmalar
Öğrenenler, sensör okumaları üzerinde kayan ortalamaları ve birikimli toplamları hesaplamak için zamana dayalı pencere sınırlarıyla $setWindowFields kullanacaklardır.
Zaman Serilerinde Pencereli Toplulaştırmalar, 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.
Pencere İşlevleri Nedir?
Pencere işlevi, $group'ın yaptığı gibi belgeleri bir grupta birleştirmeden, çevresindeki belge aralığına ("pencereye") bakarak sonuç kümesindeki her belge için bir değer hesaplar. Her girdi belgesi tam olarak bir çıktı belgesi üretir; ancak hesaplanan değer pencere genelindeki toplamayı yansıtır. MongoDB, pencere işlevlerini 5.0 sürümünde $setWindowFields aşamasıyla ekledi.
$setWindowFields Aşaması
$setWindowFields, MongoDB'de pencere işlevlerini etkinleştiren toplama aşamasıdır. Bir partitionBy ifadesini (SQL'deki PARTITION BY'ye benzer), yeni alanları ve bunların pencere işleçlerini tanımlayan bir output nesnesini ve her bölüm içindeki sıralamayı belirleyen bir sortBy belgesini kabul eder. Bu birleşim, onu zaman serileri için ideal hâle getirir: sensöre göre bölümlere ayırın, zaman damgasına göre sıralayın ve çalışan toplamları veya hareketli ortalamaları hesaplayın.
db.sensorReadings.aggregate([
{
$setWindowFields: {
partitionBy: '$sensorId', // one window per sensor
sortBy: { timestamp: 1 }, // ordered by time ascending
output: {
runningTotal: {
$sum: '$temperature',
window: { documents: ['unbounded', 'current'] }
}
}
}
}
])Belge Tabanlı Pencere Sınırları
Pencere sınırları, geçerli belgeye göre belge konumları cinsinden belirtilebilir. Özel anahtar sözcükler olan 'unbounded' (bölümdeki ilk belgeden itibaren) ve 'current' (geçerli belge) yaygın sınırları tanımlar. Tamsayıları da kullanabilirsiniz: [-3, 0], kendisinden önceki 3 belgeyi ve geçerli belgeyi ifade eder; bu, 4 noktalı hareketli ortalama için idealdir.
// 5-point rolling average (2 before, current, 2 after)
db.sensorReadings.aggregate([
{
$setWindowFields: {
partitionBy: '$sensorId',
sortBy: { timestamp: 1 },
output: {
rollingAvgTemp: {
$avg: '$temperature',
window: { documents: [-2, 2] }
}
}
}
}
])Aralık Tabanlı Zaman Pencereleri
Zaman serisi verileri için aralık tabanlı pencereler, veriler eşit aralıklarla ulaşmayabileceğinden belge tabanlı pencerelerden daha doğaldır. Aralık pencereleri, geçerli belgenin sıralama değerine göre bir birim (varsayılan olarak milisaniye) ve göreli bir miktar kullanır. Örneğin, 1 saatlik geriye dönük pencere { range: [-3600000, 0], unit: 'millisecond' } şeklinde olur. 'hour', 'minute' ve 'second' gibi özel zaman birimleri de desteklenir.
// 1-hour trailing moving average by time range
db.sensorReadings.aggregate([
{
$setWindowFields: {
partitionBy: '$sensorId',
sortBy: { timestamp: 1 },
output: {
movingAvgTemp: {
$avg: '$temperature',
window: {
range: [-1, 0],
unit: 'hour'
}
}
}
}
}
])$sum ile Çalışan Toplamlar
Çalışan toplam (veya kümülatif toplam), pencerenin 'unbounded' değerinden 'current' değerine ayarlanmasıyla hesaplanır. Her belgenin çıktı alanı, bölümdeki ilk belgeden geçerli belgeye kadar ve geçerli belge dâhil olmak üzere tüm değerlerin toplamını yansıtır. Bu, kümülatif enerji tüketimini, toplam işlemleri veya zaman içinde aktarılan baytları hesaplamak için kullanışlıdır.
// Cumulative energy consumption per device
db.energyReadings.aggregate([
{
$setWindowFields: {
partitionBy: '$deviceId',
sortBy: { timestamp: 1 },
output: {
cumulativeKwh: {
$sum: '$kwh',
window: { documents: ['unbounded', 'current'] }
}
}
}
},
{ $project: { _id: 0, timestamp: 1, deviceId: 1, kwh: 1, cumulativeKwh: 1 } }
])$rank ve $denseRank ile Sıralama
$rank ve $denseRank, belgeleri sortBy ifadesine göre sıralayarak bölümleri içinde konum numaraları atayan pencere işleçleridir. $rank, eşit değerlerde numaralandırmada boşluk bırakır (1, 2, 2, 4…); $denseRank ise bırakmaz (1, 2, 2, 3…). Bunlar sensörleri en son okumalarına göre sıralamak veya en iyi performans gösteren ilk N cihazı belirlemek için kullanışlıdır.
// Rank sensors by their average temperature (after grouping)
db.sensorStats.aggregate([
{
$setWindowFields: {
partitionBy: null, // no partition — global rank
sortBy: { avgTemp: -1 }, // highest temp ranked first
output: {
rank: { $rank: {} }
}
}
}
])$documentNumber ile Satır Numaraları
$documentNumber, sortBy'a göre sıralanmış her belgeye, bölümü içinde 1'den başlayan ardışık bir tamsayı atar. $rank'ten farklı olarak hiçbir zaman eşit sıra üretmez; her belge benzersiz bir numara alır. Bu, sayfalandırma, dışa aktarımları toplu olarak numaralandırma veya bir sensör akışındaki ardışık olayları etiketleme için kullanışlıdır.
db.sensorReadings.aggregate([
{
$setWindowFields: {
partitionBy: '$sensorId',
sortBy: { timestamp: 1 },
output: {
readingNumber: { $documentNumber: {} }
}
}
},
{ $match: { sensorId: 'sensor-42' } }
])Değerleri Kaydırma: $shift İşleci
$shift işleci, göreli bir konumdaki belgeden bir alanın değerine erişir. { $shift: { output: '$temperature', by: -1 } }, bölümdeki önceki belgenin sıcaklığını döndürür. Bu, geçerli okuma ile önceki okuma arasındaki fark olan değişimleri hesaplamak için idealdir; bu fark sensör verilerindeki değişim hızını ortaya çıkarır.
// Compute temperature delta vs previous reading
db.sensorReadings.aggregate([
{
$setWindowFields: {
partitionBy: '$sensorId',
sortBy: { timestamp: 1 },
output: {
prevTemp: {
$shift: { output: '$temperature', by: -1, default: null }
}
}
}
},
{
$addFields: {
tempDelta: { $subtract: ['$temperature', '$prevTemp'] }
}
}
])$setWindowFields ile $match Birleştirme
Çalışma kümesini küçültmek için $match aşamasını her zaman $setWindowFields'ten önce yerleştirin. Pencere hesaplamaları bellekte gerçekleşir; bu nedenle aşamaya daha az belge aktarmak RAM kullanımını önemli ölçüde azaltır. Pencere aşamasından sonra zenginleştirilmiş çıktıyı filtrelemek için başka bir $match ekleyebilirsiniz; örneğin yalnızca hareketli ortalaması bir eşik değeri aşan belgeleri tutabilirsiniz.
// Flag anomalies where temp spikes above rolling average
db.sensorReadings.aggregate([
{
$match: {
sensorId: 'sensor-42',
timestamp: { $gte: new Date('2024-06-01T00:00:00Z') }
}
},
{
$setWindowFields: {
partitionBy: '$sensorId',
sortBy: { timestamp: 1 },
output: {
rollingAvg: {
$avg: '$temperature',
window: { documents: [-9, 0] }
}
}
}
},
{
$match: {
$expr: { $gt: ['$temperature', { $multiply: ['$rollingAvg', 1.2] }] }
}
}
])Performans: Bölüm Boyutu Önemlidir
$setWindowFields, pencere değerlerini hesaplamak için her bölümü bellekte tutmalıdır. Zaman serisi verileri için bu, istenen zaman aralığındaki tek bir sensöre ait veriler anlamına gelir. Bölümleriniz çok büyükse (milyonlarca ölçüm), $match ile önceden filtreleme yapmayı veya bölümleri diske taşımak için toplama işleminde allowDiskUse: true kullanmayı düşünün. Alternatif olarak, pencere işlevlerini uygulamadan önce saatlik özetler hâlinde ön toplama yapın.
// Allow disk use for very large partitions
db.sensorReadings.aggregate(
[
{ $match: { timestamp: { $gte: new Date('2024-01-01T00:00:00Z') } } },
{
$setWindowFields: {
partitionBy: '$sensorId',
sortBy: { timestamp: 1 },
output: {
rolling7d: {
$avg: '$temperature',
window: { range: [-7, 0], unit: 'day' }
}
}
}
}
],
{ allowDiskUse: true }
)Uygulamalı Örnek: Anomali Tespiti
Eksiksiz bir anomali tespit işlem hattı; aralık filtreleme için $match'i, hareketli ortalamayı ve standart sapmayı hesaplamak için geriye dönük pencere içeren $setWindowFields'i ve yerel ortalamadan 2 standart sapmadan fazla sapan okumaları ortaya çıkarmak için $expr içeren son bir $match'i birleştirir. Bu kalıp, gerçek zamanlı IoT izleme sistemlerinin temelini oluşturur.
db.sensorReadings.aggregate([
{ $match: { timestamp: { $gte: new Date('2024-06-01T00:00:00Z') } } },
{
$setWindowFields: {
partitionBy: '$sensorId',
sortBy: { timestamp: 1 },
output: {
rollingAvg: { $avg: '$temperature', window: { documents: [-19, 0] } },
rollingStdDev: { $stdDevSamp: '$temperature', window: { documents: [-19, 0] } }
}
}
},
{
$match: {
$expr: {
$gt: [
{ $abs: { $subtract: ['$temperature', '$rollingAvg'] } },
{ $multiply: ['$rollingStdDev', 2] }
]
}
}
}
])Kısa Kontrol
Bu dersteki MongoDB ve NoSQL Veritabanları kavramlarını anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: $setWindowFields, sonucu tek bir grupta birleştirmeden her belgeyi çevresindeki pencere üzerinden hesaplanan değerlerle zenginleştirir; belge ve aralık sınırları, geriye dönük, ileriye dönük veya zaman aralığına dayalı pencereler üzerinde ayrıntılı denetim sağlar; $avg, $sum, $shift ve $rank gibi işleçler hareketli ortalamaları, çalışan toplamları, değişim hesaplamasını ve sıralamayı kapsar. Sırada expireAfterSeconds kullanarak otomatik veri süresinin dolmasını inceleyeceğiz.
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
“Zaman Serilerinde Pencereli Toplulaştırmalar” dersi ücretsiz mi?
Evet — “Zaman Serilerinde Pencereli Toplulaştırmalar” 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.
“Zaman Serilerinde Pencereli Toplulaştırmalar” dersinde ne öğreneceğim?
Öğrenenler, sensör okumaları üzerinde kayan ortalamaları ve birikimli toplamları hesaplamak için zamana dayalı pencere sınırlarıyla $setWindowFields kullanacaklardı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 3. dersidir.
“Zaman Serilerinde Pencereli Toplulaştırmalar” 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
- Zaman Serisi Koleksiyonu Oluşturma
- Zaman Serisi Verilerini Ekleme ve Sorgulama
- Zaman Serilerinde Pencereli Toplulaştırmalar
- expireAfterSeconds ile Verilerin Otomatik Süresini Dolurma