MongoDB ile yeni yeni haşır neşir olmaya başladıysanız, belgelerinizin biraz karmaşık görünmeye başladığı bir noktaya gelmiş olabilirsiniz. Bu belgeler düz, ilişkisel görünümlü veri parçalarından içiçe nesneler, içiçe diziler ve belki dört beş katmana kadar inen yapılara dönüşmüş olabilir. Peki bu veriyi birkaç katman derinlikteyken nasıl sorgularsınız?
Bu kısa eğitimde MongoDB içinde nokta gösterimine bakacağız ve içiçe alanlarda belirli değerlere sahip verileri temel alarak belgelerimizi nasıl hızlı ve kolayca filtreleyebileceğimizi göreceğiz.
Nokta gösteriminden söz ederken, içiçe alanların nokta karakteri ile ayrılmasını kastediyoruz. Örneğin:
Her bir içiçe katman için, sorgularken o katmanı ayırmak üzere bir nokta karakteri ekleriz. Eğitimin ilerleyen kısımlarında daha kapsamlı örnekler göreceğiz.
Bu eğitimden verim almak için bir MongoDB örneğinin dağıtılmış ve yapılandırılmış olması gerekir. Yani MongoDB’yi kullanmaya hazır olduğunuz bir noktada olmanız beklenir. Ayrıca MongoDB’de koleksiyon sorgulamaya en azından temel düzeyde aşina olmalısınız. Yardıma ihtiyacınız varsa dokümantasyon iyi bir başlangıç noktası olabilir.
Bu örnek için, "dbinc" veritabanı ve "people" koleksiyonu içinde aşağıdaki verileri kullanacağız:
Yukarıdaki veriler, içiçe nesneler ve diziler içerdiği için belirli bir karmaşıklığa sahip iki belgeyi temsil eder. İlginç bir bilgi: MongoDB, BSON belgelerinde 100’den fazla içiçe katmanı destekler.
Siz de adım adım ilerlemeyi planlıyorsanız, bu belgelerin MongoDB örneğinizde mevcut olduğundan emin olun.
MongoDB İçindeki Verileri Çeşitli Yaklaşımlarla Sorgulama
Basitten başlayıp yavaş yavaş daha karmaşık alanlara geçeceğiz. İyi haber şu ki burada karmaşık demek mutlaka zor demek değil.
Diyelim ki koleksiyonumuz içinde MongoDB’de çalışan tüm kişileri bulmak istiyoruz. Aşağıdakine benzer bir sorgu çalıştırabiliriz:
use dbinc;
db.people.find({
"employment.employer": "MongoDB"
});
Bu örnekte, employer alanı employment nesnesi içinde içiçe bir alan olarak bulunur. O alanı, nokta gösterimi kullanarak, yani alanları nokta karakteriyle ayırarak sorgulayabiliriz. Bu, New York’ta çalışan herkesi bulmak istememizden farklı değildir. Şöyle bir şey yapabiliriz:
use dbinc;
db.people.find({
"employment.address.state": "New York"
});
Yukarıdaki sorguda belgenin içine üç katman derinliğe kadar girdik ve sorunsuz çalıştı.
Şimdi, o içiçe nesne dizisiyle çalışmaya bir göz atalım. Yapmak istediğimize bağlı olarak birkaç farklı sorgulama yolu var.
Diyelim ki "Portfolio" web sitesini listeleyen herkesi döndürmek istiyoruz. Aşağıdakine benzer bir sorgu çalıştırabiliriz:
use dbinc;
db.people.find({
"websites.name": "Portfolio"
});
Yukarıdaki sorgu tek bir sonuç döndürür; çünkü yalnızca bir belgede "Portfolio" listelenmiştir. Dikkat ederseniz bir dizi olmasına rağmen nokta gösterimi burada da çalıştı. İnce detay şu: "Portfolio" en az bir kez o dizide bir yerde bulunmalıdır.
İşler burada ilginçleşebilir.
Diyelim ki dönen sonuçları daha da kısıtlamak istiyoruz. Bunu daha fazla filtre ölçütü ekleyerek yaparız; ancak diziler içindeki içiçe nesnelerle çalışırken işler biraz farklıdır. Örneğin şunu ele alalım:
use dbinc;
db.people.find({
"websites.name": "Portfolio",
"websites.type": "social"
});
Yukarıdaki örnekte, dizide hem "Portfolio" hem de "social" değerlerinin bulunmasını istiyoruz; ancak aynı nesnede olmak zorunda değiller. Yalnızca bir sonuç alırız; çünkü "Tony Kim" belgesinde "social" vardır ama "Portfolio" yoktur. Her iki alanın da aynı nesnede bulunması gerekiyorsa, bunun için nokta gösterimini kullanamayız.
Bu eğitimin kapsamı dışında olsa da, $elemMatch operatörünü şu şekilde kullanmak işi görür:
Yukarıdaki senaryoda hiçbir sonuç dönmez; çünkü örnek verimizde aynı nesnede eşleşen name ve type yoktur.
Dizilerle çalışıyorsanız ve üzerinde çalışmak istediğiniz dizi indeksini biliyorsanız, nokta gösterimini kullanmaya devam edebilirsiniz. Örneğin şunu ele alın:
use dbinc;
db.people.find({
"websites.0.name": "Portfolio"
});
Yukarıdaki sorgu, eşleştirmek istediğiniz dizi indeksini kullanır. Bu senaryoda, dizideki ilk öğenin name alanının "Portfolio" olduğu tüm belgeleri döndürmek istiyoruz.
Bu eğitimin kapsamı dışında olmakla birlikte, nokta gösteriminin yalnızca salt-okunur sorgularla sınırlı olmadığını belirtmek önemlidir. Güncelleme işlemlerinde, projeksiyonlarda ve birleştirme (aggregation) işlem hatlarında burada görüldüğü gibi nokta gösterimini kullanabilirsiniz.
Sonuç
MongoDB sorgularınızda nokta gösterimini kullanmaya hızlı bir giriş yaptınız. Şunları öğrendik:
Nokta gösterimi, içiçe nesnelerde çalışır.
Dizilerde de nokta gösterimini kullanabilirsiniz; ancak beklentilerinize bağlı olarak sınırlamalar vardır.
$elemMatch operatörü, tek bir dizi nesnesi içinde birden fazla alanı eşleştirmek istediğinizde gereklidir.
Belirli dizi öğelerini sorgulamak istiyorsanız, nokta gösteriminde dizi indeksleri kullanılabilir.
MongoDB koleksiyonlarınızdaki veriler muhtemelen düz olmayacaktır; yani bir noktada içiçe nesneler, içiçe diziler, nesnelerin içinde içiçe diziler ve başka karmaşıklık kombinasyonlarıyla karşılaşacaksınız. İyi haber şu ki MongoDB, zengin sorgu API’siyle bu bilgilerle çalışmayı kolaylaştırır.
Nokta gösterimi, nokta ayraç kullanarak içiçe MongoDB belge alanlarına erişmektir.
Sorgularımda çok sayıda içiçe alanla filtreleyebilir miyim?
Evet, eşleştirme sorgularınızda alanlarınızın tümünde, bazılarında veya hiçbirinde nokta gösterimini kullanabilirsiniz. Filtre aynıdır—sadece içiçe öğelere erişiyorsunuz.
Öngörülemeyen dizilerimle ne yapmalıyım?
Dizilerinizin boyut ve performans açısından sınırsız büyümemesini sağlamalısınız; ancak onları nokta gösterimiyle sorgulamak gayet iyi çalışır ve kolay kalır.
İçiçe nesneler ve diziler içeren bir belgeyi güncellemem gerekirse ne olur?
Bir güncelleme işlemi kullanırken, nokta gösterimi işlemin hem filtre kısmında hem de değişiklik kısmında çalışır.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!