MongoDB : Kurulum, Shell Komutları ve Basit Bir Uygulama
MongoDB pratik çalışmamızı içeren bu bölümü okumadan daha önce yazdığım MongoDB (Doküman Temelli ve Şema Bağımsız NoSQL Veritabanı ) yazısına göz atmanızı şiddetle öneririm. Genelde teorik zeminde yazmayı seviyorum fakat bu defa “newbie” J tarzında bir yazı ile elleri kirletmenizi hedefledim. İlk olarak MongoDB’ yi indirerek başlayalım.
Bu blog entry yazıldığı an itibarı ile geçerli olan : https://www.mongodb.org/downloads adresinden MongoDB’ yi indirebilirsiniz. Tabi herşeyin hızlıca eskidiği bir dönemde yukarıdaki link çalışmıyor ise size “download mongodb” ile arama yapmanızı öneririm. Ben Windows sürümü ile anlatmaya devam edeceğim.
Download linkine tıkladığınızda (lütfen doğru versiyonu seçin 32/64 bit vs) kurulumu birkaç next’ e tıklayarak tamamlayabilirsiniz. Kurulum inanılmaz basit…
MongoDB kurulumu tamamlandığında (eğer değiştirmediyseniz) varsayılan dizin olarak “Program Files” yada x86 dizini altında “C:\Program Files\mongodb-win32-x86_64-3.0.1” bir BIN klasörü olmalıdır. Bu dizindeki çalıştırılabilir programların herbiri farklı işler içindir. Örneğin MongoDB veritabanını başlatmak için mongod’ yi , eğer shard edilmiş cluster bir yapınızı yönetmek istiyorsanız mongos’ u ve her 2 durum içinde mongo Shell (mongo Shell sayesinde, mongodb’ de gereken komutları çalıştırmak içindir) dosyasını kullanmanız gerekecektir. Şimdilik sadece mongod ve mongo kullanımını bilmek bu yazı için yeterlidir.
Windows komut satırında (veya terminal ekranında) mongod yazarak MongoDB veritabanının başlatalım. Bu komut için birkaç parametreye daha ihtiyacımız var. Opsiyonel parametre olmasına rağmen MongoDB çalıştığında universe (database) ve collectionları (tables) hangi dizinde oluşturmasını istediğinizi –dbpath parametresi ile belirtebilirsiniz. Aşağıda benim bilgisayarımda C:\data\db dizininde bu dosyaların oluşturulması gerektiğini bildirdim.
mongod.exe --dbpath C:\data\db
Bu komuttan sonra veritabanımız çalışmaya başlamalıdır. Ekran görüntüsünü sizinle paylaşıyorum.
Ekran çıktısını dikkatlice incelediğimizde MongoDB’ nin varsayılan 27017 numaralı porttan gelecek istekleri dinlemeye başladığını görebiliriz. Ayrıca arka planda kalan görüntüde data\db dizini altında bazı dosyaların oluştuğunu fark etmiş olmalısınız. Sıra geldi ilk bağlantımız ile çalışacağımız universe ve collectionu oluşturmaya. Bu işlemlerin tamamı için bir client yazılımına ihtiyacımız olacak, mongo (mongo Shell) bu amaçla kullanılan ve MongoDB kurulumu ile bin dizini altına eklenen en önemli yardımcımız. Mongo Shell başlatmak için yeni bir komut satırı yada terminal ekranı açmalıyız. Windows kullanıcıları bir önceki adımda açtığınız ekranı kapatmayın, tahmin edebileceğiniz üzere MongoDB veritabanını istenmeyen bir biçimde durdurmuş olursunuz. Yeni bir komut satırı (cmd) başlatarak devam edelim ve bu konsolda bin dizinine ilerleyip mongo yazıp shell’i çalıştıralım:
Görebileceğiniz üzere mongo shell’i başlattığımızda (sağ resim) bir önceki adımda çalıştırdığımız MongoDB’ ye istek yollandığını ve veri tabanına aktif bir bağlantı oluşturulduğunu görebilirsiniz. (soldaki resim) Aslında mongoDB’ yi bir servis olarak başlatmak çok kolaydır. Bir konfigürasyon (.cfg) dosyasının içerisine gereken parametreleri eklediğinizde bunu yapabilirsiniz. Fakat yeni başlayanlar için çalıştırdıkları Shell komutlarının yada js kütüphanelerinden (veya MongoDB c#, java driverlarından) yolladıkları isteklerin detaylarını görebilmek için konsolu açık tutmak faydalı olacaktır. (Servis olarak çalıştırmayı merak ediyorsanız lütfen email atın)
Basit ve sık kullanabileceğiniz komutlar:
help Yardım.
show dbs MongoDB sunucusundaki tüm veritabanları listelenir.
use <db> Veritabanı ismini belirterek geçiş yapabiliriz. Eğer o veritabanı yoksa MongoDB tarafından otomatik olarak oluşturulur.
show collections Kullanılan veritabanındaki tüm kolleksiyonlar (tables) listelenir.
load() MongoDB shell'de bir javascript dosyasını çalıştırmayı sağlar.
Show dbs yazarak mevcut veritabanlarını listeleyelim:
Göreceğiniz üzere mongo ilk başlatıldığında local adlı bir veritabanı oluşturulur. (Kullanıcı ve hakları yönetmek, global değerleri saklamak için kullanılan bir veritabanıdır) Şimdi insankaynaklari adlı bir veritabanı oluşturalım:
switched to db insankaynaklari
use insankaynaklari komutu ile kullanmamak istediğimiz veritabanını belirttik, bu veritabanı olmadığı için mongoDB tarafından otomatik olarak oluşturulacaktır. Db komutu ile şu an üzerinde çalışmakta olduğumuz veritabanını sormuş olduk. (Henüz kayıt eklemediğimiz için Show dbs komutu ile listeleyemeyiz bu nedenle en az bir kayıt eklememiz gerekmekte) Şimdi kayıt ekleyelim:
> db.insankaynaklari.insert({"name":"Fırat","lastname": "Doğan","age":37,"email":"[email protected]"})
WriteResult({ "nInserted" : 1 })
> show dbs
insankaynaklari 0.078GB
local 0.078GB
Harika ! ınserted mesajını aldığımıza göre herşey yolunda demektir. (Eğer illegal token gibi bir hata alıyorsanız çift tırnakları veya Json yapınızı gözden geçirmenizi öneririm) Sonuç olarak insankaynakları dbsinin insankaynakları tablosuna (collection) yukarıdaki kaydı oluşturmuş olduk. Listeleyip emin olalım:
> db insankaynaklari
> show collections
insankaynaklari
system.indexes
Şimdi eklediğimiz bu collection’ u (insankaynaklari) silelim ve personel adlı tabloya kaydımızı ekleyelim. Kolleksiyonu silmek için:
> db.insankaynaklari.drop()
true
> show collections
system.indexes
Kolleksiyonu personel adı ile yeniden oluşturmak için ise :
> db.createCollection("personel")
{ "ok" : 1 }
> show collections
personel
system.indexes
Şimdi yukarıda gerçekleştirdiğimiz insert yani kayıt ekleme işlemini bu yeni tablo personel üzerinde gerçekleştirelim: (yukarıdaki create collection yapmasaydık bile koleksiyon/tablo olmadığı için otomatik olarak oluşturulurdu yani aşağıdaki tek adım ile tabloyu yaratmak ve kayıt eklemek mümkündür.)
>db.personel.insert({"name":"Fırat","lastname": "Doğan","age":37,"email":"[email protected]"})
WriteResult({ "nInserted" : 1 })
Şimdi kaydı listeleyelim:
{ "_id" : ObjectId("5525977a75ed913f5e7e50b5"), "name" : "Fırat", "lastname" : "Doğan", "age" : 37, "email" : "[email protected]" }
Tek bir kayıt vardı ve find() komutuna parametre vermeden onu listeledik. Peki ya 1Milyon kayıt olsaydı ekran matrix filmine benzermiydi ? Cevabı hayır. Varsayılan kayıt döndürme limiti an itibarı ile 200. Yani cursor’ ilk 200 kaydı döndürüyor ardından next diyerek diğer kayıtları listeleme şansına sahip oluyoruz. Çıktıyı daha da güzelleştirmek için .find().pretty() ekleyebiliriz. Bu durumda çok daha yakışıklı bir output’ umuz oldu:
> db.personel.find().pretty()
{"_id" : ObjectId("5525977a75ed913f5e7e50b5"), "name" : "Fırat", "lastname" : "Doğan", "age" : 37, "email" : "[email protected]"}
Bir kayıt daha ekleyelim :
>db.personel.insert({"name":"Sanem","lastname": "Çekirdek","age":27,"email":"[email protected]"})
WriteResult({ "nInserted" : 1 })
{ "_id" : ObjectId("5525977a75ed913f5e7e50b5"), "name" : "Fırat", "lastname" : "Doğan", "age" : 37, "email" : "[email protected]"}{ "_id" : ObjectId("55259a0875ed913f5e7e50b6"), "name" : "Sanem", "lastname" : "Çekirdek", "age" : 27, "email" : "[email protected]"}
Dikkat ederseniz eklemememize rağmen ObjectId alanı otomatik olarak mongo tarafından oluşturuluyor (engellemek mümkün). “Bu arada komutları autocomplete ile “tab” tuşuna basarak tamamlayabilirsiniz” Şimdi aynı tabloya yeni bir veri ekleyelim ancak bu defa yeni bir alan olan KimlikNo ile:
>db.personel.insert({"name":"Derya","lastname": "Deniz","age":35,"email":"[email protected]","KimlikNo":"TCKN12345"})WriteResult({ "nInserted" : 1 })
Bir önceki yazıda RDBMS sistemlerinde tabloyu drop edip yeni alanı eklemeden yani tasarımsal değişiklik yapmadan yukarıda ki yeni kayıtın eklenemeyeceğini sizlerle paylaşmıştım. Bu noktada şema bağımsız bir veritabanı olan MongoDB ile bu farklı alanı içeren verinin eklenebileceğini anlatmış olduk. MongoDB için her bir veri (satır) ayrı bir dökümandır. Bu nedenle doküman temellidir. Bir doküman alt dökümanlar veya dizi benzeri yapılar içerebilir. Örneğin:
db.personel.insert({"name":"Mehmet","lastname":"Deniz","age":35,"email":"[email protected]","KimlikNo":"TCKN54321",adresler:[{il:"istanbul",ilce:"Ataşehir"},{il:"Ordu",ilce:"Merkez"}]})
şeklinde eklenen dökümanda 2 farklı adreside bir dizi içerisinde saklamış olduk. Son olarak MongoDB ye bağlanmak için kullanabileceğiniz GUI temelli birkaç yazılımın adını verelim. MongoVUE, Robomongo ve MongoChef tercih edebileceklerinizden birkaç tanesi. RoboMongo’ dan oluşturduğumuz veritabanına baktığımızda ….
Bu blog yazısını hazırladığım sırada en güncel mongoDB versiyonu olan 3.0.0 ‘ a eklenen wired tiger özelliğini tek destekleyen uygulamanın MongoChef olduğunu belirterek yazımızı sonlandıralım. Bir sonraki yazıda yine Big data, özellikle Hadoop ile ilgili yazalım buda hatırlatma notumuz olsun.