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 |
|---|---|
![]() |
![]() |
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.
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.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…




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?