MongoDB - AGREGASYON (AGGREGATION)
MongoDB’de agregasyon işlemleri denilince dökümanların belli alanlara göre gruplandırılması ve bu gruplar yardımı ile bazı filtreleme ya da hesaplama işlemlerinin yapılmasını anlıyoruz. Bu işlemler SQL’de count() ve group by komutları ile gerçekleştirilir.
Şimdi bu konuyu daha iyi anlayabilmek için özel bir veri seçelim. Bu veri aşağıdaki tabloda verilmiştir:
Sicil | ad | Bölüm | Maaş |
---|---|---|---|
234 |
ali can |
Satis |
5000 |
112 |
okan sert |
pazarlama |
3000 |
567 |
ayse akıner |
Satis |
1800 |
777 |
mehmet özer |
teknik destek |
4500 |
222 |
melih sahin |
pazarlama |
3300 |
765 |
mehmet cenk |
satis |
2200 |
454 |
selin seker |
teknik destek |
3400 |
432 |
berna bilen |
muhasebe |
4500 |
113 |
deniz ikiler |
muhasebe |
2300 |
Bu tabloyu person adlı veri tabanında pers adlı koleksiyon içine yükleyelim:
> USE person
switched TO db person
> db.pers.INSERT({"sicil":234,"ad":"ali can","bolum":"satis","maas":5000 })
WriteResult({ "nInserted" : 1 })
> db.pers.INSERT({"sicil":112,"ad":"okan sert","bolum":"pazarlama","maas":3000 })
WriteResult({ "nInserted" : 1 })
> db.pers.INSERT({"sicil":567,"ad":"ayse akıner","bolum":"satis","maas":1800 })
WriteResult({ "nInserted" : 1 })
> db.pers.INSERT({"sicil":777,"ad":"mehmet özer","bolum":"teknik destek","maas":4500 })
WriteResult({ "nInserted" : 1 })
> db.pers.INSERT({"sicil":222,"ad":"melih sahin","bolum":"pazarlama","maas":3300 })
WriteResult({ "nInserted" : 1 })
> db.pers.INSERT({"sicil":765,"ad":"mehmet cenk","bolum":"satis","maas":2200 })
WriteResult({ "nInserted" : 1 })
> db.pers.INSERT({"sicil":454,"ad":"selin seker","bolum":"teknik destek","maas":3400 })
WriteResult({ "nInserted" : 1 })
> db.pers.INSERT({"sicil":432,"ad":"berna bilen","bolum":"muhasebe","maas":4500 })
WriteResult({ "nInserted" : 1 })
> db.pers.INSERT({"sicil":113,"ad":"deniz ikiler","bolum":"muhasebe","maas":2300 })
WriteResult({ "nInserted" : 1 })
Click and drag to move
Yüklediğimiz koleksiyonu listeleyelim:
> db.pers.find().pretty()
{
"_id" : ObjectId("5406dcc3f13cf7fb97cab716"),
"sicil" : 234,
"ad" : "ali can",
"bolum" : "satis",
"maas" : 5000
}
{
"_id" : ObjectId("5406dd14f13cf7fb97cab717"),
"sicil" : 112,
"ad" : "okan sert",
"bolum" : "pazarlama",
"maas" : 3000
}
{
"_id" : ObjectId("5406e45bf13cf7fb97cab718"),
"sicil" : 567,
"ad" : "ayse akıner",
"bolum" : "satis",
"maas" : 1800
}
{
"_id" : ObjectId("5406e4aaf13cf7fb97cab719"),
"sicil" : 777,
"ad" : "mehmet özer",
"bolum" : "teknik destek",
"maas" : 4500
}
{
"_id" : ObjectId("5406e52ef13cf7fb97cab71a"),
"sicil" : 222,
"ad" : "melih sahin",
"bolum" : "pazarlama",
"maas" : 3300
}
{
"_id" : ObjectId("5406e588f13cf7fb97cab71b"),
"sicil" : 765,
"ad" : "mehmet cenk",
"bolum" : "satis",
"maas" : 2200
}
{
"_id" : ObjectId("5406e5d8f13cf7fb97cab71c"),
"sicil" : 454,
"ad" : "selin seker",
"bolum" : "teknik destek",
"maas" : 3400
}
{
"_id" : ObjectId("5406e625f13cf7fb97cab71d"),
"sicil" : 432,
"ad" : "berna bilen",
"bolum" : "muhasebe",
"maas" : 4500
}
{
"_id" : ObjectId("5406e653f13cf7fb97cab71e"),
"sicil" : 113,
"ad" : "deniz ikiler",
"bolum" : "muhasebe",
"maas" : 2300
}
SORU:
Şimdi şu işlemi gerçekleştirmek istiyoruz: “Her bölümde çalışan kişi sayılarını listeleyiniz!”
ÇÖZÜM:
Bu sorunun cevabını aggregate() fonksiyonu ile aşağıdaki ifade ile bulabiliriz:
> db.pers.aggregate([{$group : {_id : "$bolum" ,personel_sayisi : {$sum : 1}}}])
Bu komut sonucunda aşağıdaki çıktı elde edilecektir:
{ "_id" : "muhasebe", "personel_sayisi" : 2 }
{ "_id" : "teknik destek", "personel_sayisi" : 2 }
{ "_id" : "pazarlama", "personel_sayisi" : 2 }
{ "_id" : "satis", "personel_sayisi" : 3 }
>
SORU:
Her bölümdeki maas ortalamasını bulunuz!
ÇÖZÜM:
Bu sorunun çözümü avg() fonksiyonunu uygun biçimde kullanarak oluşturulur:
> db.pers.aggregate([{$group : {_id : "$bolum" ,ortalama_maas : {$avg : "$maas"}}}])
>
Sonuçta aşağıdaki çıktı elde edilecektir:
{ "_id" : "muhasebe", "ortalama_maas" : 3400 }
{ "_id" : "teknik destek", "ortalama_maas" : 3950 }
{ "_id" : "pazarlama", "ortalama_maas" : 3150 }
{ "_id" : "satis", "ortalama_maas" : 3000 }
>
SORU:
Her bölümdeki en yüksek maaşı bulunuz!
ÇÖZÜM:
> db.pers.aggregate([{$group : {_id : "$bolum" ,ortalama_maas : {$max: "$maas"}}}])
{ "_id" : "muhasebe", "ortalama_maas" : 4500 }
{ "_id" : "teknik destek", "ortalama_maas" : 4500 }
{ "_id" : "pazarlama", "ortalama_maas" : 3300 }
{ "_id" : "satis", "ortalama_maas" : 5000 }
>
Sorunun cevabı olan MongoDB komutu ve çıktısı aşağıdadır:
SORU:
Her bölümdeki en düşük maaşı bulunuz!
ÇÖZÜM:
Sorunun cevabı olan MongoDB komutu ve çıktısı aşağıdadır:
> db.pers.aggregate([{$group : {_id : "$bolum" ,ortalama_maas : {$min: "$maas"}}}])
{ "_id" : "muhasebe", "ortalama_maas" : 2300 }
{ "_id" : "teknik destek", "ortalama_maas" : 3400 }
{ "_id" : "pazarlama", "ortalama_maas" : 3000 }
{ "_id" : "satis", "ortalama_maas" : 1800 }
>