Bu bölüm, MongoDB istatistiksel analizinin detaylı bir açıklamasını sunmaktadır ve bunun temel aracı olan Aggregation Pipeline'a odaklanmaktadır. Bu, SQL'deki "group by" ifadesine benzer. MongoDB kabuğunda, istatistiksel analiz db.collection.aggregate() işlevi kullanılarak gerçekleştirilir.

Önkoşul Öğretici

MongoDB Aggregation Pipeline

Genel Adımlar

  • Hedef verileri filtrelemek için $match kullanın
  • Verileri gruplayıp hesaplamak için $group kullanın
  • Sonuçları sıralamak için $sort kullanın (isteğe bağlı)

Test Verileri

orders koleksiyonundaki veriler aşağıdaki gibidir

{ _id: 1, cust_id: "abc1", ord_date: ISODate("2012-11-02T17:04:11.102Z"), status: "A", amount: 50 }
{ _id: 2, cust_id: "xyz1", ord_date: ISODate("2013-10-01T17:04:11.102Z"), status: "A", amount: 100 }
{ _id: 3, cust_id: "xyz1", ord_date: ISODate("2013-10-12T17:04:11.102Z"), status: "D", amount: 25 }
{ _id: 4, cust_id: "xyz1", ord_date: ISODate("2013-10-11T17:04:11.102Z"), status: "D", amount: 125 }
{ _id: 5, cust_id: "abc1", ord_date: ISODate("2013-11-12T17:04:11.102Z"), status: "A", amount: 25 }

aggregate İşlevi

db.collection.aggregate(pipeline) Açıklama:

  • pipeline bir dizi parametre alır, burada her bir öğe bir işleme aşamasını temsil eder.

Örnek

db.orders.aggregate([
                     { $match: { status: "A" } },  // İlk aşama
                     { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },   // İkinci aşama
                     { $sort: { total: -1 } }  // Üçüncü aşama
                   ])

Eşdeğeri SQL

select sum(amount) as total from orders 
        where status="A" 
        group by cust_id 
        order by total desc

$match Aşaması

Biçim:

{ $match: { <sorgu> } }

Açıklama:

  • <sorgu> MongoDB sorgu koşulları

Sorgu koşullarını belirlemek için kullanılır. $match ihmal edilirse, tüm verileri sorguladığı anlamına gelir.

İpucu: MongoDB sorgu sözdizimine aşina değilseniz, lütfen önceki bölümlere bakın.

$group Aşaması

SQL'deki group by ifadesine benzer, verileri gruplamak ve gruplanmış veriler üzerinde bir dizi istatistiksel hesaplama yapmak için kullanılır.

$group'ın Temel Kullanımı

Sözdizimi:

{
  $group:
    {
      _id: <ifade>, // Gruplama koşulu, örneğin: hangi alana göre gruplayacağı
      <field1>: { <accumulator1> : <expression1> },  // Birikim işlemi, N birikim işlemi eklenebilir
      ...
    }
 }

Açıklama:

  • - Özel istatistiksel gösterge adı, toplamda N olabilir
  • - Birikim işlevi, SQL'in toplam, ortalama gibi birikim işlevlerine benzer, farkı MongoDB'nin birikim işlevlerinin $ öneki ile adlandırılmasıdır, örneğin: $sum, $avg
  • - Birikim işlevinin parametresi, genellikle sayılacak alan değeri, belge alanlarına "$alan adı" formatını kullanarak atıfta bulunulur

Örnek:

db.orders.aggregate([
                     {
					 	$group: { 
							_id: "$cust_id",
							total: { $sum: "$amount" }, // İlk hesaplanmış gösterge toplamı ekler, $sum toplama operatörünü kullanır
							amount_avg: {$avg: "$amount"}  // İkinci hesaplanmış gösterge ortalama ekler, $avg ortalama hesaplama operatörünü kullanır
						} 
					}
               ])

Çıktı:

{ "_id" : "abc1", "total" : 75, "amount_avg" : 37.5 }
{ "_id" : "xyz1", "total" : 250, "amount_avg" : 83.33333333333333 }

Eşdeğeri SQL:

select 
	sum(amount) as  total,
	avg(amount) as amount_avg
from orders 
group by cust_id

$group Birleştirme İşlevleri

$group için yaygın olarak kullanılan birleştirme işlevleri aşağıdaki gibidir:

Operatör Açıklama Örnek
$avg Ortalama hesaplar {$avg: "$amount"}
$sum Toplama {$sum: "$amount"}
$max Maksimum değer {$max: "$amount"}
$min Minimum değer {$min: "$amount"}
$first Birleştirmenin ardından veri döndürür, ilk belgenin içeriği {$first: "$amount"}
$last Birleştirmenin ardından veri döndürür, son belgenin içeriği {$last: "$amount"}
$push Birleştirmenin ardından veri döndürür { $push: { ord_date: "$ord_date", amount: "$amount" }
$addToSet Birleştirmenin ardından veri döndürür, $push'tan farklı olarak tekrarları kaldırır { $addToSet: "$amount" }

$push Örneği

db.orders.aggregate(
   [
     {
       $group:
         {
           _id: "$cust_id",
           all: { $push: { ord_date: "$ord_date", amount: "$amount" } } // ord_date ve amount alanlarının değerleri
         }
     }
   ]
)

Çıktı

{ "_id" : "abc1", "all" : [ { "ord_date" : "2021-04-18 00:00:00", "amount" : 50 }, { "ord_date" : "2021-04-21 00:00:00", "amount" : 25 } ] }
{ "_id" : "xyz1", "all" : [ { "ord_date" : "2021-04-18 00:00:00", "amount" : 100 }, { "ord_date" : "2021-04-20 00:00:00", "amount" : 25 }, { "ord_date" : "2021-04-21 00:00:00", "amount" : 125 } ] }

$addToSet Örneği

db.orders.aggregate(
   [
     {
       $group:
         {
           _id: "$cust_id",
           all_amount: { $addToSet: "$amount" } // Tüm farklı amount değerlerini döndürür
         }
     }
   ]
)

Çıktı

{ "_id" : "abc1", "all_amount" : [ 25, 50 ] }
{ "_id" : "xyz1", "all_amount" : [ 100, 25, 125 ] }

$sort:

$sort aşaması genellikle birleştirilmiş veriyi sıralamak için sona konur.

Format:

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

Açıklama:

  • , - Sıralanacak alanların adları; birden fazla alanı destekler.
  • - Sıralamanın yönü, azalan için -1, artan için 1.

Örnek:

db.orders.aggregate([
                     { $match: { status: "A" } },
                     { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
                     { $sort: { total: -1 } }
                   ])

Birleştirme Sayfalandırma

$limit ve $skip operatörlerini kullanarak sayfalama uygulayabiliriz.

Örnek:

db.orders.aggregate([
                     { $match: { status: "A" } },
                     { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
                     { $sort: { total: -1 } },
					 { $limit: 5 }, // Döndürülen kayıt sayısını sınırlandırır, sayfalama'daki sayfa boyutuna benzer.
					 { $skip: 1 } // Belirli sayıda kaydı atlar, SQL'deki ofsete benzer.
                   ])