Java ile MongoDB Kullanımı – 1

Daha önceki makalemde de kısaca belirttiğim gibi MongoDB; son yıllarda giderek yaygınlaşan veri tabanı türledinden biridir. Dolayısıyla sağlamak istediğimiz bilgileri yerel bir sunucuda (Local Host) saklayabileceğimiz gibi Uzak bir sunucuda da saklayabilmemiz mümkündür.

Bu makalede ise Java Programlama Dili kullanılarak uzak bir MongoDB sunucusuna (MongoLab.com) bağlanıp çeşitli veri tabanı işlemlerinin (veri silme, ekleme, güncelleme v.b.) nasıl yapıldığını anlatacağım.

Ilk olarak yeni bir Java projesi oluşturduktan sonra aşağıda vermiş olduğum; MongoDB ve JSON kullanımı için gerekli olan Java kütüphanelerini indirip projeye ekliyoruz.

 

MongoDB Java Kütüphanesi v3.2.1 (.jar)

JSON Kütüphanesi (.jar)

 

Projeyi oluşturup kütüphaneleri ekledikten sonra MongoLab.com’a girip kullanıcı adı ve şifremizle login oluyoruz.

MongoDBJava

Login olduktan sonra işlem yapacağımız veri tabanını listeden tıklıyoruz. ( burada bizim veri tabanımızın adı : veritabani )

Resimde de görmüş olduğunuz gibi yukarıda MongoDB sunucumuza bağlanabilmek için gerekli olan URI (URI Nedir?) bilgileri yer almaktadır. Burada resimde de altını çizdiğim <dbuser> ve <dbpassword> kısımları yerine bizim Users sekmesinde oluşturduğumuz kullanıcı adı ve şifreleri kullanıyoruz. (Konuyla ilgili ayrıntılı bilgi için: http://umutonur.com/web-servis-restful-api-ile-mongodb-kullanimi/ )

Benim bu makale için oluşturduğum Kullanıcı adı ve şifre bilgileri aşağıdaki gibidir. Veri tabanını istediğiniz gibi kullanabilirsiniz. ;

Kullanıcı Adı (<dbuser>) : umutonur
Şifre (<dbpassword>) : 123456

Java kodlarına dönecek olursak:

MongoLab.com’dan aldığımız URI ile MongoDB sunucumuza bu şekilde bağlanıyoruz. Sunucuda ki herhangi bir veri tabanına bağlanmak için ise getDatabase(“veri tabanının adı”) metodunu kullanıyoruz. Yine aynı şekilde işlem yapmak istediğimiz koleksiyonu belirlemek için ise getCollection(“koleksiyonun adı”) metodunu kullanıyoruz.

Bizim bu makale için oluşturmuş olduğumuz veri tabanının adı “veritabani“, koleksiyonun adı da “umutonur.com” olduğuna göre kodları şu şekilde kullanacağız :

MongoDB Java Kütüphanesi v3 ve sonraki versiyonlarda mevcut olan MongoDatabase ve MongoCollection sınıflarından veri tabanı ve koleksiyonlarda işlem yapabilmek için kullanılan Java sınıflarıdır. Document isimli sınıf ise verilerimizi aynı JSON formatında olduğu gibi anahtar : değer ilişkisi şeklinde saklamamızı sağlamaktadır.  Kullanımı ise JSON sınıflarıyla birbirlerine çok benzemektedir.

Şimdi seçtiğimiz koleksiyona bir veri ekleyip MongoLab.com üzerindeki görünümüne ve program üzerindeki JSON çıktısına bakalım.

Burada ki append() metodu JSON’daki put() metodu ile aynı işlevi görmektedir. Istersek değer ekleme işlemini append() yerine şu şekilde put() kullanarakta yapabiliriz:

Her iki kullanımda da aynı sonucu elde ediyoruz.

Kodda kullandığımız insertOne() metodu ise belirlediğimiz koleksiyona veri eklememizi sağlıyor.

MongoLab.com üzerindeki görünüm :

doc

 

JSON Çıktısı :

insertOne() metodu sadece bir tane nesne eklememize olanak sağlamaktadır.
Eğer koleksiyonumuza bir veri dizisi eklemek istersek insertMany() metodunu kullanarak bunu yapabiliriz.

Şimdi eklediğim nesneyi koleksiyondan silip insertMany() ile koleksiyona yeni bir dizi ekleyeceğim.

 

Burada deleteOne() metodu bir tane veri nesnesini silmemizi sağlıyor. Bu metodun içinde birde eq(“Ad”, “Umut”) metodunu göreceksiniz. Kullandığımız eq() metodu bizim veriler arasında filtreleme yaparak istediğimiz veri nesnesini silmemize olanak sağlıyor. Yani burada deleteOne(eq(“Ad”, “Umut”)) yaparak veriler içinde “Ad” anahtarının “Umut” değerine eşit olduğu veri nesnesini bulup, sadece o nesneyi sildik.

Daha sonra “sayi” anahtarının 1‘den 5‘e kadar ardışık değerler aldığı bir veri (Document) dizisi (Array) tanımladık ve bunu koleksiyonumuza dahil ettik.

Koleksiyonun son haline MongoLab.com’da bakacak olursak :

liste

 

Resimde de görüldüğü gibi “sayi” anahtarı her veri’de 1 ile 5 arasında ardışık değerler almıştır. deleteOne() ve eq() metodlarının daha iyi anlaşılması açısından “sayi” değerinin 4 olduğu veriyi silip MongoLab’daki görünümüne bakalım.

Kodda görüldüğü gibi eq(“sayi”, 4) metodu ile “sayi” değerinin 4‘e eşit olduğu veri filtrelenip deleteOne() metoduyla bu veri silinmiştir.

liste2

eq() metodu ile filtrelemeye kısa bir giriş yaptığımıza göre find() metodu kullanarak veriler içerisinde arama işlemleriyle konuya devam edebiliriz.

Yukarıda JSON çıktısı almak için find() metodunu kullanmıştım. find() metodu koleksiyon içinde belirli kriterlere göre arama yapılmasını sağlar.Sona eklediğimiz first() metodu ise yapılan aramada sonucunda çıkan verilerin ilkini bize vermektedir.

Burada collection.find().first() metodu kullanırken herhangi bir filtreleme yapmadığımız için koleksiyonun tüm elemanlarını tarayacak, ve çıkan sonuçların ilk elemanını bize verecektir. Eğer biz find(eq(“sayi”,1)) gibi bir filtreleme işlemi yapsaydık, koleksiyon içinde “sayi” değerinin 1 olduğu veri nesnelerini tarayacak,

kodu ile tarama sonucu çıkan nesnelerden ilk elemanın JSON çıktısını elde edebilecektik.

Arama yaparken kendimize bir çok kriter belirleyebiliriz. Mesela az önceki örneği düşünürsek, bu koleksiyonda “sayi” değerlerinde 3‘ten büyük olan veri nesnelerini bulabiliriz. Yada değerleri belli bir sıraya göre aratabiliriz. Fakat bu makalede sadece eq() metodunu kullanacağım.

find() metoduyla yaptığımız aramalarda first() metodu da kullanarak bulunan verilerin ilk elemanını bu şekilde elde edebilmekteyiz.
Diğer elemanları elde edebilmek için ise iterator() metodunu ve MongoCursor sınıfını kullanmaktayız. Burada iterator() metodu; bize arama sonuçlarını MongoCursor sınıfı tipinde döndürmektedir. MongoCursor sınıfı ise bu sonuçlar içerisindeki elemanlarla işlem yapabilmemizi sağlar.

Şimdi koleksiyonumuzdaki elemanları teker teker çekip JSON çıktılarını ekrana yazdıralım

ilk olarak:
MongoCursor<Document> cursor = collection.find().iterator();
kodu ile Document tipinde veriler içerecek olan cursor adında bir MongoCursor nesnesi oluşturduk.

Burada hasNext() ve next() metodunu görmektesiniz. next() metodu cursor içinde listelenmiş olan nesnelere sırayla teker teker erişmemizi sağlamaktadır. hasNext() metodu ise next() ile erişebileceğimiz herhangi bir eleman olup olmadığının bilgisini boolean (true yada false olarak) tipinde bize vermektedir.
Örneğimiz üzerinden açıklayacak olursak: Toplamda 4 elemanı olan koleksiyonumuzda find() metodu ile tarama yapıp bunu iterator() metodu ile cursor isimli MongoCursor<Document> nesnesine aktarıyoruz.

Bir while döngüsü oluşturup cursor.hasNext() kullanarak erişilebilecek bir veri elemanı olup olmadığını kontrol ediyoruz. Koleksiyonda 4 adet eleman olduğuna göre bu next() metoduyla erişebileceğimiz bir eleman olduğu anlamına geliyor ve cursor.hasNext() metodu bize true değerini veriyor. Böylece döngü içindeki kodlar 1 kez çalışıp next() metoduyla ilk elemana erişiyor ve bu elemanın JSON çıktısını ekrana yazdırıyoruz.

Daha sonra while döngüsü cursor.hasNext() kullanarak next() metodu ile erişebileceğimiz 2. bir eleman olup olmadığını kontrol ediyor ve sonuç true olacağından 2. elemanında JSON çıktısı ekrana yazdırılıyor.

Bu işlem 3. ve 4. eleman içinde gerçekleştiriliyor.
4. elemanın JSON çıktısı ekrana yazdırıldıktan sonra cursor.hasNext() metodu ile sırada başka bir eleman olup olmadığı kontrol ediyor. Koleksiyon içerisinde 5. bir eleman olmaması nedeniyle bu metodun sonucu false oluyor ve döngüden çıkılıyor.

cursor.next() metodu bizim Document tipinde bir veri elde etmemizi sağlamaktadır. Document ile JSONObject kullanımları birbiriyle aynı olduğu için bir JSON Nesnesinde yapılan işlemler Document içinde geçerlidir.
Koleksiyon içerisindeki verilerin her birinin kendine ait ve onları tanımlayan değerler (Object Id) bulunmaktadır.

“_id” : { “$oid” : “56c596b260ea942657a53499” }

Bu değerler bizim koleksiyon elemanlarını birbirinden ayırt edebilmemize de olanak sağlar. Şimdi koleksiyondaki elemanların JSON çıktılarını ekrana yazdırmak yerine, bu elemanların Object Id‘lerini ve “sayi” anahtarının değerini ekrana yazdıralım.

Dikkat ederseniz döngü içerisinde cursor.next() metodunu 1 kez kullanmaya çalışıyorum. Bunun sebebi şu; cursor.next() döngüsü her kullanıldığında sıradaki elemana geçeceği için farklı elemanların değerine erişmeme neden olacaktır, buda programın yanlış kurgulanmasına sebep olacaktır.

Yani ;

şeklinde kullandığımda cursor.next().getObjectId(“_id”) bana ilk elemanın Object Id‘sini verirken aynı kod içindeki cursor.next().getInteger(“sayi”) ise bana bir sonraki elemandaki “sayi” anahtarının değerini verecektir.

Dolayısıyla;

kodunun ekran çıktısı

şeklinde olacaktır. Bu da programımızın yanlış kurgulandığını bize gösterir.

 

Bir koleksiyona veri eklerken insertOne() ve insertMany(), veri silerken deleteOne() ve arama yaparken find() metodlarının kullanıldığından bahsettik.

Bir veride güncelleme yaparken ise yine bunlara benzer olan updateOne() metodunu kullanıyoruz. Güncelleme yaparkende collection.updateOne(eski veri, yeni veri) mantığını kullanıyoruz.

Burada eski veri kısmında istersek eq() ile filtreleme yapabiliriz,

collection.updateOne(eq(“sayi”, 1), new Document(“$set”, new Document(“sayi”, 5)));

koleksiyondan seçtiğimiz bir Document verisini kullanabiliriz.

Document eleman = cursor.next();
collection.updateOne(eleman, new Document(“$set”, new Document(“sayi”, 5)));

her iki durumda da bizim belirlediğimiz eski veri; “sayi” : 5 değerinin olduğu bir Document ile güncellenecektir.
burada ki $set parametresi; eski veri değer ve anahtarlarının silinip (Object Id hariç) yerine yeni veri değer ve anahtarlarının oluşturulmasını sağlamaktadır.

Biz şimdi koleksiyondaki “sayi” değerinin 2 olduğu elemanı güncelleyerek “sayi” değerini 5 yapıp, “güncelleme” : true değerinde yeni bir anahtar ekleyelim ve koleksiyonun tüm elemanlarını JSON çıktısı olarak ekrana yazdıralım.

Ekran Çıktısı:

Gördüğünüz gibi “sayi” nın 2 olduğu eleman güncellenip “sayi” değeri 5 olarak değiştirildi ve “güncelleme” : true değerinde yeni bir anahtar eklendi. Bu işlemler sonunda Object Id değişmemiştir.

updateOne() metodu ile bir tane veriyi güncelleyebildiğimiz gibi updateMany() metoduylada birden çok veriyi güncellememiz mümkündür. Ayrıca metod içinde yine updateOne() da olduğu gibi filtreleme yapmamızda mümkündür. Şimdi “sayi” değerinin 5 olduğu elemanlarda güncelleme yapıp yeni anahtarlar ekleyeceğim.

Bu kez “sayi” değerinin 5 olduğu elemanları filtreleyip bu değeri 3 yaptık, ve güncelleme yaptığımız elemanlara “güncelleme” : true ve “silinecek” : true anahtarları ekledik. UpdateResult sınıfını kullanarak ta güncelleme işleminin sonuçlarını aldık. Burada getModifiedCount() metodu bize güncellenen eleman sayısını vermektedir.

Programın ekran çıktısı şu şekilde :

updateMany() metodu ile aynı anda birden fazla elemanda güncelleme yaptıktan sonra, şimdi de benzer bir kullanıma sahip olan deleteMany() metodu ile “silinecek” anahtarının true değerine eşit olduğu elemanları filtreleyip bunları koleysiyondan sileceğiz.

Burada DeleteResult sınıfı bize silme işleminin sonuçlarını gösteren sınıftır. getDeletedCount() metodu da bize kaç tane elemanın silindiğini gösterir. Koddan da anlaşıldığı gibi eq(“silinecek”,true) metodu ile verileri filtreliyor, deleteMany() metodu ile de filtrelenen verileri siliyoruz.

Programın ekran çıktısı :

Bu makalede genel hatlarıyla MongoDB’nin Java ile kullanımına bir giriş yapmış olduk. Elbette ki MongoDB’nin bize sunduğu avantajlar bu anlattıklarımızdan ibaret değil. İlerleyen günlerde MongoDB kullanımıyla ilgili geri kalan özellikleri 2. bir başlık altında yayınlamayı düşünüyorum.
Şimdilik benden bu kadar. 🙂

Bir sonraki makalede Android ile MongoLab.com’da veri tabanı işlemlerini, kendi hazırlamış olduğum hazır bir sınıf sayesinde nasıl yapabileceğimizi anlatacağım.

Takipte kalın,

Hoşçakalın.. 😉




You may also like...

1 Response

  1. Tekin Güllü dedi ki:

    Teşekkürler. Çok güzel anlatmışsınız.

Bir Cevap Yazın

This site uses Akismet to reduce spam. Learn how your comment data is processed.