Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

MongoDB – İlişkilendirme Sonucunda Eşleşmeyen Verileri Getirme

Merhaba,

Önceki yazılarımdan NoSQL – MongoDB İşlevsel Fonksiyonlar ve Aggregate Operatörleri başlıklı makalemde “$lookup” operatörü ile MongoDB veritabanında iki farklı collectionın nasıl ilişkilendirildiğini incelemiştik. Bu içeriğimizde ise ilişkilendirme sonucunda eşleşmeyen verilerinde elde edilmesi için ne yapılması gerektiğini konuşacağız.

İçeriğimizi anlaşılabilir kılmak için “Employee” ve “Order” olmak üzere iki örnek collection üzerinden zenginleştireceğiz.

Employee Collection Order Collection
MongoDB - İlişkilendirme Sonucunda Eşleşmeyen Verileri Getirme MongoDB - İlişkilendirme Sonucunda Eşleşmeyen Verileri Getirme

Yukarıdaki collectionlara göz atarsanız eğer “Employee” collectionındaki “9” ve “10” idlerine sahip documentlere karşılık “Order” collectionında bir kayıt bulunmamaktadır.

router.get("/listOrder", (request, response, next) =>
    employeeModel.aggregate
        ([
            {
                $lookup: {
                    from: "order",
                    localField: "_id",
                    foreignField: "employeeId",
                    as: "orderList"
                }
            },
            {
                $unwind: "$orderList"
            },
            {
                $project: {
                    orderNumber: "$orderList.orderNumber",
                    name: 1,
                    surName: 1
                }
            }
        ])
        .then(data => response.render("home", { data: data }))
        .catch(error => response.send("Veriler listelenirken beklenmeyen bir hatayla karşılaşıldı."))
);

Dolayısıyla bu şekilde bir ilişkilendirme sonucu sadece eşleşen kayıtların geldiğini görmekteyiz.

MongoDB - İlişkilendirme Sonucunda Eşleşmeyen Verileri Getirme

Eğer ki eşleşmeyen kayıtların gelmesini istyorsak aşağıdaki gibi “$unwind” operatöründe “preserveNullAndEmptyArrays” parametresine “true” vermeniz gerekmektedir.

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

Bu işlem neticesinde iki collection arasında eşleşen eşleşmeyen tüm kayıtların elde edildiğini görebilmekteyiz.
MongoDB - İlişkilendirme Sonucunda Eşleşmeyen Verileri Getirme

İlgilenenlerin faydalanması dileğiyle…

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

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. MMutlu dedi ki:

    Merhaba, öncelikle emek verip bu paylaşımları hazırladığınız için teşekkür ederim. $lookup ile ilişki kurma konusunda bir sorum olacaktı size, bir çok araştırma yaptım ama bir türlü anlayacağım şekilde bir cevap bulamadım.

    Örneğin,

    Kitaplar adında bir collectionum var id, başlık, açıklama alanlarım olduğunu düşünelim. Bir de yazarlar diye collectionum var onda da ad, soyad ve hakkında olsun.

    Yapmak istediğim kitap eklerken bir alan daha gelsin istiyorum yani ilgili kitaba bir yazar atama kısmı,

    Örnek olarak da

    books modeli
    const Book = require('../Models/Book');
    router.post('/new', function(req, res, next) {
        const  book = new Book({
            title: 'Hikayelerde ve çocuk',
    
            // Buraya gelecek kısım ne olmalı?
            userId: "users.id",
    
            category: 'Hikaye',
    
      book.save((err, data) => {
            if (err)
                console.log(err);
            res.json(data);
        });
    });
    
    router.get('/aggregate-lookup', (req, res) => {
        Book.aggregate([
            {
                $lookup: {
                    from: 'users',
                    localField: 'userId',
                    foreignField: '_id',
                    as: 'user'
                }
            }
        ], (err, result) => {
            res.json(result);
        });
    });
    
    module.exports = router;
    

    Book

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    const BookSchema = new Schema({
        title: String,
        userId: {
            type: mongoose.Schema.Types.ObjectID
        },
        category: String,
    });
    module.exports = mongoose.model('Book', BookSchema);
    
    ///
    

    Bir de user collectionum var. Yukarıda books model de userId kısmını nasıl yapıp eklemede ilgil yazarın _idsini otomatik aldırabilirim. Şimdi manuel olarak post metodu ile oraya idyi elle yazıyorum eklerken ilişkiyi böyle kuraibliyorum.

    Bu konuda destek olur musunuz?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir