Mongo DB Ve Java Temel İşlemler 3 - Kayıt Çekme - İkinci Bölüm
Merhabalar. Önceki yazıda MongoDB veritabanımızdan kayıt çekme işlemlerinin bir kısmını görmüştük. Bu yazı ile de kayıt çekme işlemlerini tamamlayacağız.
Java kodumuza geçmeden önce yine MongoDB’deki kayıtlardan herhangi birisine göz atalım:
{
"_id": "57c19b523e9b4210f7353280",
"address": {
"street": "2 Avenue",
"zipcode": "10078",
"building": "1480",
"coord": [
-73.9557413,
40.7720266
]
},
"borough": "Manhattan",
"cuisine": "Russian",
"grades": [
{
"date": "27-08-2016",
"grade": "A",
"score": 12
},
{
"date": "27-08-2016",
"grade": "B",
"score": 13
}
],
"name": "Vella",
"restaurant_id": "41704620"
}
MongoDB’den kayıt çekme işlemleri sırasında büyüktür&küçüktür işlemleri de uygulanabilir. Yani belli bir değerin üstündekileri ya da altındakileri getir diyebiliriz. Örneğin yukarıdaki kaydı baz alarak score alanı değerinin 13’den büyük olan kayıtlarının getirilmesini istiyoruz. Bunun için kullanacağımız kodumuz şu şekilde olur:
import static com.mongodb.client.model.Filters.gt;
FindIterable<Document> iterable = database.getCollection("Records").find(gt("grades.score", 13));
iterable.forEach(new Block<Document>(){
@Override
public void apply(final Document document){
System.out.println(document);
}
});
Kodu çalıştırdığımızda karşımıza gelen çıktı da şöyle,
Tabii burada şu sorulabilir. Bu greades altında iki kayıt tutuluyor, örneğin 13-14 şeklinde olsa idi ne olacaktı? O zaman 13-14 score’una sahip kayıt da getirilecekti çünkü bize 13’den büyük score alanına sahip tüm kayıtlar getiriliyor. grades altındakilern sadece birinin istenenden büyük olması yeterli.
Yukarıdaki kod şu şekilde de kullanılabilirdi:
FindIterable<Document> iterable = database.getCollection("Records").find(new Document("grades.score", new Document("$gt", 13)));
Eğer belirli bir değerden küçük değerleri getir demek istiyorsak da lt‘yi kullanabiliriz. Şu kod parçası da iki score alanından birisi 15’den küçük değer içeren tüm kayıtları getirecektir.
import static com.mongodb.client.model.Filters.lt;
FindIterable<Document> iterable = database.getCollection("Records").find(lt("grades.score", 15));
Yine aynı şekilde bu kod da yukarıdaki gibi new Document parametre verilerek kullanılabilir:
FindIterable<Document> iterable = database.getCollection("Records").find(new Document("grades.score", new Document("$lt", 15)));
Ekran çıktımız da şöyle olur, 15’den küçük score alanı olan tüm kayıtlar getirilir:
SQL ile klasik veri tabanı işlemeri yaparken kullanılan AND,OR işlemleri MongoDB’nin Java kütüphanesinde de mevcut. Şimdi örneğin cuisine alanı Turkish olan ve score alanı 11 olan kayıtları getir diyelim. Kodumuz şu şekilde olur:
FindIterable<Document> iterable = database.getCollection("Records").find(and(eq("grades.score", 11),eq("cuisine", "Turkish")));
Resimde de gördüğümüz gibi cuisine alanı Turkish olan ve 11 score’una sahip kaydı bize getirdi.
Aynı kod şu şekilde de yazılabilirdi, bu durumda önceki örneklere benzer şekilde döküman parametresi yolluyoruz fakat AND işleminin gerçekleşmesi için şartlarımızı append‘liyoruz:
FindIterable<Document> iterable = database.getCollection("Records").find(and(new Document("cuisine", "Turkish").append("grades.score", 11));
OR operatörünü kullanmak istediğimizde ise döküman parametresi yollayacaksan durum yukarıdakinden farklı oluyor. OR işleminin yapılacağını bildirmek için parametre olarak verilen dökümanda $or olması gerekiyor. Örnek kodumuz şöyle olur:
FindIterable<Document> iterable = database.getCollection("Records").find(new Document("$or", asList(new Document("cuisine", "Turkish"),
new Document("grades.score", 14))));
Parametre olarak geçirdiğimiz dökümanda birinci parametre yani key parametresi OR işleminin yapılacağını bildiren $or oluyor, ikinci parametre hangi şartlarda veri beklediğimizi bildiriyor. Biz cuisine key’ine karşılık Turkish değeri olan veya score alanı 14 olan kayıtları getir diyoruz.
Yukarıdaki kod şu şekilde de kullanılabilirdi:
import static com.mongodb.client.model.Filters.or;
FindIterable<Document> iterable = database.getCollection("Records").find(or(eq("cuisine", "Turkish"), eq("grades.score", 14)));
Bazı durumlarda veritabanından aldığımız kayıtlarımızı artan ya da azalan sırada elde etmek isteriz. Bunun için de MongoDB Java kütüphanesinin içinde sort() metodu yer alıyor. sort metoduna az önceki gibi bir döküman parametre geçireceğiz ve dökümanın key alanı hangi alana göre sıralama yapmak istediğimiz, value alanı ise artan mı yoksa azalan sırada mı listelemek istediğimizi belirtecek. Örnek kodumuz şöyle :
FindIterable<Document> iterable = database.getCollection("Records").find().sort(new Document("address.zipcode", -1));
Kodumuz içinde sort metoduna verdiğimiz döküman parametresinin key alanı hangi alana göre sıralama yapılıp kayıtlar getirilsin demek içindir. Value alanı ise artan mı azalan sırada mı listeleme yapmayı belirtmek içindir. Eğer 1 gönderirseniz bu artan sırada demektir, -1 gönderirseniz azalan sırada demektir. Kodu çalıştırınca zipcode alanına göre şöyle bir azalan sırada çıktı elde ediyoruz:
Yukarıdaki kod şu şekilde de yazılabilirdi,Sorts sınıfı altındaki ascending-descending metotlarını kullanabiliriz. Örneğin azalan sırada listeleme için descending metodunu kullanıyoruz:
import static com.mongodb.client.model.Sorts.descending;
FindIterable<Document> iterable = database.getCollection("Records").find().sort(descending("address.zipcode"));
Biz yukarıdaki örneklerde tek bir key’e göre sıralama yapılmasını istedik. Eğer birden fazla key işin içine girecekse kodumuz şöyle olmalıdır:
FindIterable<Document> iterable = database.getCollection("collectionName").find().sort(new Document("selectKey1", 1 or -1).append("selectKey2", 1 or -1));
//Ya da şu şekilde de olabilir
FindIterable<Document> iterable = database.getCollection("collectionName").find().sort(ascending or descending("selectKey1", "selectKeyTwo"));
Bu yazıda da bu kadar arkadaşlar. MongoDB’den kayıt çekme işlemlerini tamamladık. Gelecek yazıda kayıt güncelleme işlemlerine değineceğiz. Görüşene kadar sağlıcakla kalın.
Selam ve Sevgilerimle