Veriler ile uğraşırken iki farklı veri arasındaki ilişkiler önemlidir. Bu nedenle bu ilişkilerin iyi tespit edilerek tasarlanması gerekir. Veri yapıları tasarlandığında bir veri içerisinden ilişkili olduğu diğer veriye ulaşmanın kolay olması programcı açısından gereklidir. Bu yapılan işlemlerin daha hızlı olmasını sağlayacaktır.
Mesela elimizde Uye adında bir veri var ve bu üyenin kayıt olduğu kurslar olduğunu düşünelim. Şimdi basitçe bir uye verisi oluşturalım.
const uye = {
id: 29,
isim: "Ali",
yas: 23,
sehir: {
kod: "41",
isim: "Kocaeli"
}
}
Örneğimizde üyenin yaşadığı şehir için sehir adında bir alan açtık ve bu alana başka bir veri nesnesini ekledik. Günlük kullanımda şehirin de farklı bir nesne olarak tasarlanması ve iki veri arasında bir ilişki kurularak uye nesnesi içerisine sadece sehir nesnesinin ID değerinin geçirilmesi işimizi oldukça kolaylaştıracaktır.
const uye = {
id: 29,
isim: "Ali",
yas: 23,
sehir: 41
}
Bu kullanımımızda sadece şehir ID değeri kullanılarak şehir bilgisine ulaşmak istenmiştir.
Mongoose Kullanırken Koleksiyonlar Arası İlişki Kurma
Mongoose ile Mongo veritabanı üzerinde işlem yaparken, bir koleksiyonun içerisinde farklı bir koleksiyon eklenebilir ve bunun için sadece eklenecek verinin _id değeri gereklidir. Mesela yine üye verisi üzerinden gidelim.
const UserSchema = Schema({
name: {
type: String,
required: true,
},
email: {
type: String,
required: true,
unique: true,
},
password: {
type: String,
required: true,
},
city: {
type: mongoose.Schema.Types.ObjectId,
ref: 'City',
},
});
Örneğimizde UserShema olarak bir kullanıcı koleksiyonu tanımlıyoruz. Bu koleksiyon içerisinde yine city adındaki alanımızda farklı bir koleksiyon olan City bilgisini tutuyoruz. Bir üye oluşturulduğunda bu bölüme üyenin yaşadığı şehirin veri tabanı üzerindeki _id değeri ile şehir bilgisini ekleyebileceğiz.
Şimdi bir üye bilgisini ekleyelim.
const city = City.findOne({name: 'Kocaeli'});
User.create({
name: 'Ali',
email: 'alinin@emaili.com',
password: 'sifre',
city: city._id,
});
Bu şekilde bir kullanıcı oluşturulduğunda biz kullanıcıya ulaşmak için farklı mongoose metodlarını kullanabiliriz. Mesela find, findOne, findById gibi. Şimdi findOne ile bu veriye ulaşmaya çalışalım.
const user = User.findOne({email: 'alinin@emaili.com'});
artık kullanıcı ile ilgili tüm bilgiler ulaşabiliriz. Tabii olarakda city bilgisine de ulaşabiliriz. Fakat user.city kullanıdığımızda sadece şehir bilgisinin _id değerini görebiliriz.
console.log(user.name);
// Konsola
// Ali
// yazar
console.log(user.city);
// Ekrana şehirin id değerini yazdırır.
Peki biz kullanıcının yaşadığı şehirin ismine ihtiyaç duyarsak. Yeni bir sorgu mu yapacağız? Aslında yapabiliriz fakat bu durumda mongoose populate bizim yardımımıza koşuyor. Sorgu işlemini yaparken populate metodunu kullandığımızda user.city bilgisinin içerisi city nesnesi ile doldurulacak ve biz de buradan city ile ilgili istediğimiz veriye kolayca ulaşabileceğiz. Şimdi sorgumuzu yeniden yazalım.
const user = User.findOne({email: 'alinin@emaili.com'}).populate('city');
Kullanımı oldukça basit, sorgunun sonuna populate(‘istenen_veri_alani_adi’) şeklinde bir metod ekliyoruz. Burada isim populate etmek istediğimiz alanın adını yazıyoruz. Şimdi artık city alanında istediğimiz alana ulaşabiliriz.
console.log(user.city.name);
// Konsola
// Kocaeli
// yazdırır.
Mongoose Populate Nedir?
Mongoose populate bir koleksiyon içerisinde farklı bir koleksiyon ile ilişki kurulduğu zaman, bir sorgu içerisinde koleksiyon verilerini alırken ilişkili koleksiyon verisini de veritabanından çekerek sonuç verisi içerisine ekler. Böylece farklı bir sorgu yapmadan tek sorgu içerisinde hem hem istediğimiz koleksiyon verisini alıyoruz ve ayrıca koleksiyon ile ilişkili diğer koleksiyon verisini de veri tabanından çekebiliyoruz.
Yukarıda verdiğimiz örnekte olduğu gibi, kullanıcı bilgileri çekilirken, şehir bilgisini tutan city koleksiyonundan tüm şehir bilgisini de user bilgisine ekleyerek geri dönderebiliyoruz.
Eğer populate metodunu kullanmasaydık, yapmamız gereken önce user bilgisini veritabanından çekmek ve sonrasında yeni **user.city** değerini kullanarak yeni bir sorguda şehir bilgisini çekmek olacaktı.
const user = User.findOne({email: 'alinin@emaili.com'});
const city = City.findById(user.city);Sorgu sayısını azaltarak daha hızlı ve etkin bir çalışma için populate kullanabiliriz.
Sonuç
Mongoose ile çalışırken ilişkili verileri ikinci bir sorgu yapmadan almak için populate metodu kullanılabilir. Bu metod ile bir koleksiyondan veri çekilirken eğer farklı bir koleksiyon ile ilişkisi varsa, ilişkili olduğu kayıtın tüm bilgilerini de sorgu ile birlikte getirir.
Mongoose populate ile yaptığımız gibi sizde farklı metodları kullanarak işlem yapıyor musunuz?
