Article Image
Article Image
read

Bugün scala kullanarak MongoDBye bağlanıp nasıl database işlemleri yapabileceğimizden bahsedeceğim.

MongoDB halihazırda kurulu değilse

Halihazırda MongoDB yüklemediyseniz websitesinde verilen talimatları uygulayarak çok basit bir şekilde kurulumu tamamlayabilirsiniz. Ayrıca docker bilginiz varsa yükleme ile uğraşmayıp MongoDB containerını çok hızlı ayağa kaldırıp devam edebilirsiniz.

Bunun yanısıra databasei yönetmek için RoboMongo toolunu kullanmanızı tavsiye ederim.

Reactive Mongo

Scalada MongoDByi bağlamak için farklı kütüphaneler kullanılabiliyor. Bu kütüphaneler arasında Mongo Scala Driver, ve şimdilerde eskide kalan Casbah gibi resmi olarak desteklenenler olsa da open source topluluklar ile birlikte geliştirilen Tepkin, FrontLets, Subset2 gibi açık kaynak kodlu kütüphaneler de güncel olarak birçok scala projelerinde aktif olarak kullanılmaktadır. Benim tercihim yine açık kaynak olarak geliştirilen ve şimdilerde çok popüler olan Reactive Mongo kütüphanesi oldu.

  • Tepkin her ne kadar güncel olmasa da şimdilerde Almanya’da yaşayan Fehmi Can Sağlam tarafından yazıldığı için listeye ekledim.

Başlarken

İlk olarak Reactive Mongoyu build.sbt dosyamıza ekleyerek kütüphaneye erişmemiz gerekiyor. Bunun için aşağıdaki gibi kendi build.sbt dosyamıza Reactive Mongoyu ekleyelim.

Not: Scala Play Frameworkü kullandıgım için bu configurationlar diğer frameworklerde farklılık gösterebilir.

libraryDependencies ++= Seq(
  "org.reactivemongo" %% "play2-reactivemongo" % "0.11.11",
)

Ardından kodumuzu yazmaya başlayabiliriz.

İlk olarak reactivemongo kütüphanesindeki ReactiveMongoApiyi import etmemiz gerekiyor. (Bkz. 1. satır)

Daha sonra query stringlerini yazabilmemiz için reactivemongonun play frameworku için tanımlanmış json kütüphanesini de import ediyoruz.

Şimdi case classımızı yazmaya başlayabiliriz. Case classımız ReactiveMongoApi ve namei parametre olarak alıyor. Üçüncü parametre bizim database de hangi makineyi tercih edeceğimizi belirtiyor. Mongo‘da primary ve secondary gibi farklı makineler mevcut. Biz burada default olarak secondaryi seçiyoruz. Bu bilgiler genelde cloud üzerinde mongo makinelerimizi barındırıyorsak işimize yarayacak. Şimdilik konumuz bu olmadığı için üzerine durmuyorum.

Collectionları oluşturmak için reactiveMongoApinin collection methodunu kullanıyoruz. Ve argüman olarak name parametremizi veriyoruz.

Ardından insert methodumuz ile T tipinde bir documenti ilgili collectiona ekliyoruz.

import play.modules.reactivemongo.ReactiveMongoApi

case class MongoCollection(reactiveMongoApi: ReactiveMongoApi, name: String, readPreference: ReadPreference = ReadPreference.secondaryPreferred) {
  lazy val collection :JSONCollection = reactiveMongoApi.db.collection[JSONCollection](name)

  def insert[T: OWrites](document: T): Future[WriteResult] = {
    collection.insert(document)
  }
}

Neden collection değişkenini lazy val olarak tanımladık?

Bunun cevabı için lazy val ile val arasındaki farkı bilmemiz yeterlidir. val tipindeki bir değişken yazıldığında compiler ilk olarak o değişkeni yaratır. Ve her çağrıda o değişken yeniden yaratılır. lazy val de is tam tersine bu değişken bir yerde çağrılana kadar çalıştırılmaz ve çağrıldığı anda değeri o değişkene yazar ve tekrar tekrar çağırdığınızda yeniden üretmek yerine daha önce yazdığı değeri döner. İlgili collectionımız değişmeyeceği için lazy val tanımlamamamız için hiçbir sebep yok.

Aşağıda tanımladığımız case classı kullanarak bir örnek yapalım.

Basitçe name ve age bilgisini parametre olarak alan insertUser methodumuz user tablosuna name ve age fieldları olan bir döküman olarak kaydediyor. namein String ve agein Long tipinde olduğu görebiliyoruz.

Eğer insertUser("Abdullah", 22) olarak çağırırsak databasede namei Abdullah agei 22 olan bir kayıt yaratmış olacağız.

 
import models.MpCollection
import play.modules.reactivemongo.ReactiveMongoApi
import reactivemongo.play.json._
import reactivemongo.play.json.collection.JSONCollection

class User ()(reactiveMongoApi: ReactiveMongoApi) {

  lazy val collection = MongoCollection(reactiveMongoApi, "user")

  def insertUser(name: String, age:Long) = {

    val q = Json.obj("name" -> name, "age" -> age)

    collection.insert(q)
  }
}

Bu işlem sonucunda databasede aşağıdaki gibi bir kayıt oluştu.

{
  "_id" : ObjectId("5a709663ae065a39d4d0a99b"),
  "name": "Abdullah",
  "age": 22
}

Temel olarak database işlemleri için bu kadar bilginin yeterli olacağını düşünüyorum.

Eğer anlamadığınız bir yer var ise alt kısımdaki disqus’a yorum yapabilirsiniz.

İçerikte herhangi bir eksiklik veyahut yanlış olduğunu düşündüğünüz bir kısım var ise mail atmaktan çekinmeyin.

Blog Logo

Abdullah Velioglu


Published

Image

A Snowball Effect

A Personal Blog For Abdullah

Back to Overview