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
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.
])