İçerik Tablosu
- Sol Birleştirmeleri ve MongoDB Yaklaşımı Anlamak
- $lookup Operatöründe Ustalaşmak
- Sonuçları Filtreleme
- Gelişmiş Toplama Teknikleri
- Performansı Optimize Etme
- Sıkça Sorulan Sorular
Sol Birleştirmeleri ve MongoDB Yaklaşımı Anlamak
SQL veritabanlarında, sol birleştirme, sol tablodaki tüm satırların sonuç kümesine dahil edilmesini sağlar. Sağ tabloda eşleşen bir satır varsa, karşılık gelen veriler birleştirilir; aksi takdirde, sağ taraftaki alanlar NULL değerleriyle doldurulur. NoSQL bir veritabanı olan MongoDB’nin doğrudan bir “SOL BİRLEŞTİRME” komutu yoktur. Bununla birlikte, toplama çerçevesi içindeki güçlü $lookup
operatörünü kullanarak aynı işlevi sağlayabiliriz.
$lookup Operatöründe Ustalaşmak
$lookup
operatörü, belirtilen alanlara göre iki koleksiyondaki belgeleri birleştirir. “Sol” koleksiyondaki tüm belgeleri, “sağ” koleksiyonda eşleşme bulunup bulunmadığına bakılmaksızın döndürdüğünü anlamak çok önemlidir. Sözdizimini inceleyelim:
db.collection1.aggregate([
{
$lookup: {
from: "collection2", // Sağ koleksiyon
localField: "field1", // Eşleşme için collection1'deki alan
foreignField: "field2", // Eşleşme için collection2'deki alan
as: "results" // Eşleşen belgeleri tutacak dizi alanı
}
}
])
İki koleksiyon düşünelim: customers
ve orders
.
customers koleksiyonu:
_id | name | city |
---|---|---|
1 | John Doe | New York |
2 | Jane Smith | London |
3 | Peter Jones | Paris |
orders koleksiyonu:
_id | customer_id | amount |
---|---|---|
1 | 1 | 100 |
2 | 1 | 200 |
3 | 2 | 50 |
Sol birleştirme gerçekleştirmek için $lookup
kullanıyoruz:
db.customers.aggregate([
{
$lookup: {
from: "orders",
localField: "_id",
foreignField: "customer_id",
as: "orders"
}
}
])
Bu, tüm müşterileri döndürür. Siparişi olanların dolu bir orders
dizisi olacaktır; olmayanların ise boş bir dizisi olacaktır.
Sonuçları Filtreleme
$match
aşaması, birleştirme sonrası filtreleme sağlar. Örneğin, 100$’ı aşan siparişleri olan müşterileri bulmak için:
db.customers.aggregate([
{
$lookup: { /* ... (yukarıdakiyle aynı $lookup) ... */ }
},
{
$match: {
"orders.amount": { $gt: 100 }
}
}
])
Gelişmiş Toplama Teknikleri
Toplama boru hattının esnekliği $lookup
ve $match
‘ın ötesine uzanır. $unwind
(dizileri ayırmak için), $group
(verileri toplamak için) ve $sort
(sonuçları sıralamak için) gibi aşamalar, karmaşık veri dönüşümleri için kullanılabilir. Örneğin, her müşterinin toplam harcamasını hesaplamak için:
db.customers.aggregate([
{
$lookup: { /* ... (yukarıdakiyle aynı $lookup) ... */ }
},
{ $unwind: "$orders" },
{
$group: {
_id: "$_id",
name: { $first: "$name" },
totalSpent: { $sum: "$orders.amount" }
}
}
])
Performansı Optimize Etme
Büyük veri kümeleri için performans çok önemlidir. localField
ve foreignField
‘da kullanılan alanların indekslenmesi çok önemlidir. Verimli indeksleme, birleştirme işlemini önemli ölçüde hızlandırır. Gereksiz aşamaları ortadan kaldırmak ve sorgu verimliliğini optimize etmek için toplama boru hattınızı analiz edin.
Sıkça Sorulan Sorular
S: field1
veya field2
‘nin birden fazla eşleşmesi varsa ne olur? C: $lookup
, results
dizisinde tüm eşleşen belgeleri döndürecektir. Her birini ayrı ayrı işlemek için $unwind
kullanın.
S: SAĞ BİRLEŞTİRME yapabilir miyim? C: Doğrudan değil. $lookup
‘ta koleksiyonları ters çevirin ve eşleşmeyen belgeleri buna göre işleyin.
S: Çok büyük koleksiyonlarla performans nasıl yönetilir? C: İndeksleme çok önemlidir. İşlemeyi en aza indirmek için boru hattınızı optimize edin.