Merhabalar.

Önceki yazıda MongoDB veri tabanımıza Java ile nasıl kayıt ekleyebileceğimizi görmüştük. Bu yazıda ve gelecek yazıda ,iki parça halinde, var olan kayıtların nasıl çekileceğini göreceğiz. Aslında tek yazı içinde kayıt çekme işlemini anlatmak istiyordum ama uzun yazı yazmayı ve size uzun, sıkıcı yazı okutmak istemediğimden kayıt çekme işlemini iki parçaya böldüm.

Öncelikle önceki yazıda girdiğimiz kayıtlardan herhangi birisinin MongoDB’deki halini görelim ve akabinde Java kodumuz ile başlayalım.

{
    "_id": "57c1991a3e9b4210c9d291c9",
    "address": {
      "street": "2 Avenue",
      "zipcode": "10075",
      "building": "1480",
      "coord": [
        -73.9557413,
        40.7720266
      ]
    },
    "borough": "Manhattan",
    "cuisine": "Turkish",
    "grades": [
      {
        "date": "27-08-2016",
        "grade": "A",
        "score": 11
      },
      {
        "date": "27-08-2016",
        "grade": "B",
        "score": 17
      }
    ],
    "name": "Vella",
    "restaurant_id": "41704620"
}

MongoDBSelectRecords.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package io.github.ilkgunel.mongodb;

import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import static com.mongodb.client.model.Filters.eq;
import org.bson.Document;
/**
 *
 * @author ilkaygunel
 */
public class MongoDBSelectRecords {
    public static void main(String[] args) {
        MongoClient mongoClient=null;
        
        try {
            mongoClient = new MongoClient("localhost", 27017);
            MongoDatabase database = mongoClient.getDatabase("MongoDB");
            
            FindIterable<Document> iterable = database.getCollection("Records").find();
            
            iterable.forEach(new Block<Document>(){
                @Override
                public void apply(final Document document){
                    System.out.println(document);
                }
            });
        } catch (Exception e) {
            System.out.println("An Error Occured! Error is:"+e);
        }
        finally{
            mongoClient.close();
        }
    }
}

Yukarıdaki kod MongoDB içindeki bir Collection’daki tüm kayıtları getirmeye yarayan bir koddur. Sınıfımız içerisinde öncelikle MongoDB veritabanımıza kayıt sağlıyoruz. Nasıl kayıt sağladığımıza önceki yazımızda değinmiştim.

FindIterable<Document> iterable = database.getCollection("Records").find();

satırı ile Records atındaki collection’ı getir diyoruz ve find() metodu ile tüm kayıtları Document tipinde veri tutan FindIterable nesnesine koy diyoruz.Akabinde bu FindIterable sınıfına özgü olan forEach metodundan iterable nesnesi üzerinden faydalanarak tüm kayıtlarımızı konsola yazdırıyoruz. finally bloğunda ise açmış olduğumuz MongoClient nesnesini kapatıyoruz. Kodu çalştırdığımız zaman şöyle bir çıktı elde ediyoruz.

Şimdi ben MongoClient üzerinden Records dökümanındaki her bir kaydın cuisine alanlarını değiştiriyorum. Turkish,American,German vb. atamalar yapıyorum.

Eğer döküman içindeki spesifik alana özgü bir kayıt çekmek istersek, mesela cuisine alanı Turkish olanı getir demek istersek o zaman find() metodunun içine parametre vermemiz gerekir. Şöyle ki:

//FindIterable<Document> iterable = database.getCollection("Records").find();
FindIterable<Document> iterable = database.getCollection("Records").find(new Document("cuisine","Turkish"));

Kod içindeki new Document(“cuisine”,”Turkish”) ifadesi cuisine alanına Turkish alanına Turkis ataması yapıyor ve bu döküman find metoduna parametre olarak gidince sadece cuisine alanı Turkish olan kayıtların getirilmesini sağlıyor. Kodu çalıştırdığımızda şöyle bir çıktı alırız:

find metodu sadece yeni bir dökümanı parametre almak zorunda değildir. eq() metodunun parametre olarak verilmesi de aynı işlemi gerçekleştirir. Kullanımı şöyledir:

import static com.mongodb.client.model.Filters.eq;
//FindIterable<Document> iterable = database.getCollection("Records").find();
//FindIterable<Document> iterable = database.getCollection("Records").find(new Document("cuisine","Turkish"));
FindIterable<Document> iterable = database.getCollection("Records").find(eq("cuisine", "Turkish"));

Yukarıdaki cuisine alanı dökümanımızın doğrudan bir alanı idi. Yani tablodaki bir kolon gibi düşünebiliriz. Peki bir alanın altındaki alana göre kayıt çekmek istersek? O zaman da “.” ile ayırarak önce istediğimiz alt alanın üst alan adını ardından da istediğimiz alanın adını parametre olarak geçiriyoruz. Şimdi ben yine MongoClient üzerinden önceki yazıda eklemiş olduğumuz kayıtlardaki address alanının altındaki zipcode alanlarını kafama göre değiştiriyorum ve 10075,10076,10077 gibi değerler veriyorum. Mesela cuisine alanı Amerikan olan kayıt için zipcode 10077. Select işlemini yapacak kodum da şöyle:

//FindIterable<Document> iterable = database.getCollection("Records").find();
//FindIterable<Document> iterable = database.getCollection("Records").find(new Document("cuisine","Turkish"));
//FindIterable<Document> iterable = database.getCollection("Records").find(eq("cuisine", "Turkish"));
FindIterable<Document> iterable = database.getCollection("Records").find(eq("address.zipcode", "10077"));

Kodu çalıştırdığımda gelen çıktı şöyle:

Yukarıdaki kodu az önce bahsettiğimiz gibi new Document(…) deyip de yapabilirdiniz.

Önceki yazıda da bahsettiğim üzere biz bir alanın altına birden fazla aynı alanları içerecek şekilde kayıtlar koyabiliriz. Yazının başındaki JSON’dan da gördüğümüz gibi address alanı altına ilgili alanları barındıran tek kayıt giriliyor. Fakat grades alanı altına aynı alanların var olduğu birden fazla kayıt girdik. Bu durumda grades alanı altında bir array mevcut oluyor. Fakat kayıt çekerken bu durum bizim için bir değişiklik doğurmuyor. Biz address alanı için address.zipcode dediğimiz gibi grades alanı için de grades.grade diyebiliriz. Kodumuz da şöyle olur:

FindIterable<Document> iterable = database.getCollection("Records").find(eq("grades.grade", "A"));

Tabi biz burda ilgili kayıtların grade alanları ile hiç oynamadık ve tüm kayıtlar A’ya sahip grade barındırdığı için yukarıdaki kod yine tüm kayıtları getirecektir.

Bu yazıda bu kadar arkadaşlar. Gelecek yazıda kayıt çekme işlemlerinin ikinci kısmını göreceğiz. O yazıda greater than, less than, logical or,and konularına değineceğiz. Görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle