MongoDB – Gruplama İncelikleri($group Operatörü)

Merhaba,

Önceki yazılarımdan NoSQL – MongoDB İşlevsel Fonksiyonlar ve Aggregate Operatörleri başlıklı makalemde “$group” operatörü ile nasıl gruplama işleminin yapıldığına değinmiştik. Bu içeriğimizde ise gruplama işleminde ekstradan nelerin yapılabileceğini inceleyecek ve tekniği MongoDB sınırlarında daha da detaylandıracağız.

Makalemizi anlaşılabilir kılmak için birbirleriyle ilişkilendirilmiş “Employee” ve “Order” collectionları üzerinden örneklendirmede bulunacağız.

Employee CollectionOrder Collection
MongoDB - Gruplama İncelikleri($group Operatörü)MongoDB - Gruplama İncelikleri($group Operatörü)

Şimdi bu collectionlar üzerinde pratiksel açıdan güçlenebilmek için ısınma çalışmalarıyla alıştırmalar yapalım.

  • Alıştırma 1
    Tüm personellerin hangi satışları yaptığını listeleyelim

    router.get("/employeeOrders", (request, response, next) =>
        employeeModel.aggregate([
            {
                $lookup: {
                    from: "order",
                    localField: "_id",
                    foreignField: "employeeId",
                    as: "orderList"
                }
            },
            {
                $unwind: {
                    path: "$orderList",
                    preserveNullAndEmptyArrays: true
                }
            },
            {
                $group: {
                    _id: "$name",
                    orders: {
                        $push: "$orderList"
                    }
                }
            },
            {
                $project: {
                    _id: 0,
                    name: "$_id",
                    orders: "$orders"
                }
            }
        ])
            .then(data => response.json(data))
            .catch(error => response.send("Veriler listelenirken beklenmeyen bir hatayla karşılaşıldı."))
    );
    

    Yukarıda yapılan çalışmada “$group” operatörüne hususi göz atarsak eğer;

    .
    .
    .
                $group: {
                    _id: "$name",
                    orders: {
                        $push: "$orderList"
                    }
                }
    .
    .
    .
    

    “_id” alanına personelin adı atanmışken, “orders” alanına kodun önceki adımlarında ilişki sonucu elde edilen “order” collectionındaki veriler push edilmekte yani dizi olarak verilmektedir.

    Bu işlem neticesinde “$project” operatörü ile “name” alanına gruplama işlemi netcesinde elde edilen “_id” alanı verilmekte. Benzer mantıkla “orders” alanına ise push edilen “orderList” verisi verilerek tüm siparişler listelenmektedir.

    Netice olarak;
    MongoDB - Gruplama İncelikleri($group Operatörü)

    Gördüğünüz gibi hangi personelin hangi satışı yaptığını elde etmiş bulunmaktayız.

  • Alıştırma 2
    Hangi personelin kaç adet satış yaptığını hesaplayalım

    router.get("/employeeOrders", (request, response, next) =>
        employeeModel.aggregate([
            {
                $lookup: {
                    from: "order",
                    localField: "_id",
                    foreignField: "employeeId",
                    as: "orderList"
                }
            },
            {
                $unwind: {
                    path: "$orderList",
                    preserveNullAndEmptyArrays: true
                }
            },
            {
                $group: {
                    _id: "$name",
                    count: { $sum: 1 }
                }
            }
        ])
            .then(data => response.json(data))
            .catch(error => response.send("Veriler listelenirken beklenmeyen bir hatayla karşılaşıldı."))
    );
    

    Bu şekilde ilişkilendirme sonucu hangi personelin kaç adet satış yaptığını görebiliriz.
    MongoDB - Gruplama İncelikleri($group Operatörü)
    Burada dikkat edilmesi gereken husus hiç satış yapmayan personellerin bile satış adedi “1” değerini göstermektedir. Bu hatayı ortadan kaldırabilmek için “$unwind” operatöründeki “preserveNullAndEmptyArrays” özelliğini “false” yapabilirsiniz.

  • Alıştırma 3
    Hangi personelin kaç adet satış yaptığını daha detaylı hesaplayalım
    Yukarıda yapmış olduğumuz çalışmayı daha da detaylı bir hale getirelim;

    router.get("/employeeOrders", (request, response, next) =>
        employeeModel.aggregate([
            {
                $lookup: {
                    from: "order",
                    localField: "_id",
                    foreignField: "employeeId",
                    as: "orderList"
                }
            },
            {
                $unwind: {
                    path: "$orderList",
                    preserveNullAndEmptyArrays: true
                }
            },
            {
                $group: {
                    _id: {
                        name: "$name",
                        surName: "$surName"
                    },
                    orders: {
                        $push: "$orderList"
                    }
                }
            },
            {
                $project: {
                    _id: 0,
                    name: "$_id.name",
                    orderCount: { $size: "$orders" },
                    orders: "$orders"
                }
            }
        ])
            .then(data => response.json(data))
            .catch(error => response.send("Veriler listelenirken beklenmeyen bir hatayla karşılaşıldı."))
    );
    

    Hemen gruplama işlemini incelemek için aşağıya alalım;

    .
    .
    .
                $group: {
                    _id: {
                        name: "$name",
                        surName: "$surName"
                    },
                    orders: {
                        $push: "$orderList"
                    }
                }
    .
    .
    .
    

    Gördüğünüz gibi “_id” alanına bu sefer direkt bir değer vermek yerine object verilmiştir. İlgili object içerisine “name” ve “surName” değerleri atanmıştır. Ayriyetten “orders” alanına yukarıda ilişkilendirme sonucu elde edilen “orderList” veri kümesi atanmaktadır.

    Bu işlemin devamında “$project” operatörünün kullanımına göz atarsak eğer;

    .
    .
    .
                $project: {
                    _id: 0,
                    name: "$_id.name",
                    orderCount: { $size: "$orders" },
                    orders: "$orders"
                }
    .
    .
    .
    

    Burada özellikle “orderCount” alanına dikkatinizi çekmek istiyorum. “$group” operatöründen gelen “orders” alanındaki koleksiyonun eleman sayısını “$size” operatörüyle hesaplayarak değerini “orderCount” alanında yayınlamaktayız.

    MongoDB - Gruplama İncelikleri($group Operatörü)

    Görüldüğü üzere bu şekilde bir çalışma sergileyince eşleşmeyen veriler sıfır olarak gösterilmesinden dolayı daha tutarlı sonuçlarla karşılaşmış bulunmaktayız.

İlgilenenlerin faydalanması dileğiyle…

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.