Teknoloji ipuçlarını kendin uygula
İçerik
Son yazılar
Biz kimiz
Yazılım Atölyesi, adım adım teknoloji rehberleriyle kendi başına öğrenip uygulama yapmak isteyenlere yardımcı olur. Pratik ipuçları, araç önerileri ve çözümler bulacaksınız.

MongoDB Aggregation Pipeline Veri İşleme

Aggregation pipeline, MongoDB'nin veri dönüştürme motorudur. Belgeler bir boruya girer, aşama aşama işlenir, sonuçta istediğiniz şekle bürünür. SQL tarafında GROUP BY, JOIN ve HAVING ile yaptığınız işlerin çoğu burada birer aşamaya karşılık gelir.

Bu rehberi okurken elinizde çalışan bir MongoDB olsun. Yoksa Docker ile tek komutta bir mongo konteyneri ayağa kaldırabilirsiniz; containerization başlangıç notlarımızdaki mantık burada da işe yarar. Örnekleri siparisler adında bir koleksiyon üzerinden anlatacağım. Alanlar: musteriId, tutar, durum, urunler[], olusturmaTarihi.

Pipeline Mantığını Aşama Aşama Kurmak

Pipeline bir dizidir. Her elemanı bir aşamadır. Aşamalar sırayla çalışır. Bir aşamanın çıktısı, sonraki aşamanın girdisidir. Bu yüzden sıralama, sonucu da hızı da belirler.

Temel aşamaları tanıyın

Önce sık kullanılan aşamaları ezberlemeden kavrayın:

AşamaNe yaparSQL karşılığı
$matchBelge filtrelerWHERE
$projectAlan seçer, yeni alan üretirSELECT
$groupGruplar ve toplarGROUP BY
$sortSıralarORDER BY
$limit / $skipSayfalamaLIMIT / OFFSET
$lookupBaşka koleksiyonla birleştirirLEFT JOIN
$unwindDiziyi belgelere açar

İlk gerçek pipeline'ınız şöyle olabilir:

Yazımı: db.siparisler.aggregate([{ $match: { durum: "tamamlandi" } }, { $group: { _id: "$musteriId", toplam: { $sum: "$tutar" }, adet: { $sum: 1 } } }, { $sort: { toplam: -1 } }, { $limit: 10 }])

$group içinde akümülatörleri kullanın

$group'un gücü akümülatörlerde. Sık kullanılanlar:

_id alanı grup anahtarıdır. Birden fazla alana göre gruplamak isterseniz nesne verin: _id: { musteri: "$musteriId", durum: "$durum" }. Tüm koleksiyonu tek grup yapmak için _id: null kullanın.

Dizileri ve tarihleri işleyin

Belgelerdeki diziler pipeline'da en çok kafa karıştıran kısımdır. Sırayı şöyle kurun:

  1. $unwind ile diziyi açın. Her eleman ayrı bir belge olur.
  2. Açılmış belgeleri $group ile yeniden toplayın.
  3. Gereksiz alanları $project ile kesin.

Tarih kırılımı için $dateToString veya $dateTrunc işinizi görür. Aylık ciro için: { $group: { _id: { $dateToString: { format: "%Y-%m", date: "$olusturmaTarihi" } }, ciro: { $sum: "$tutar" } } }. Metin içinde desen arayacaksanız $match içinde $regex kullanabilirsiniz; regex rehberindeki kalıplar burada da geçerlidir.

Performans ve Hata Ayıklama

Aggregation yazmak kolay, hızlı çalıştırmak beceri ister. Sorunların çoğu aşama sırasından ve eksik indeksten doğar.

Filtreyi öne alın, indeksi kullanın

explain ile ölçün

Tahmin etmeyin, bakın. db.siparisler.aggregate(pipeline, { explain: true }) çıktısında şunları arayın: