VERİTABANI (DATABASE)
Veritabanı, koleksiyonlardan oluşan bir veri grubudur. Tek bir MongoDB örneği (instance) çok sayıda bağımsız veri tabanlarından oluşabilir.
Her belge “_id” şeklinde özel bir anahtara sahiptir; bu anahtar bir koleksiyon içinde tektir (unique). MongoDB, basit fakat çok güçlü JavaScript kabuğu (shell) kullanır ve bunun yardımı ile veri tabanlarının işlenmesi çok daha etkin hale gelir.
Belge ya da doküman, Mongo DB’nin merkezinde yer alır; belge, sıralanmış bir anahtarlar kümesinden oluşur, her anahtar bir değer ile ilişkilidir. Örneğin,
{“opSystem”:”iOS”} bir anahtar-değer ikilisinden oluşmaktadır. Burada “opSystem” anahtar(key) ve “iOS” ise bu anahtar ile ilişkili değerdir.
Bazı dökümanlar çok daha karmaşık olabilir; birden fazla anahtar/değer ikilisi içerebilir:
{“ opSystem”:”iOS”,”device”:”iPhone 6”}
Anahtarlar string türündedir. Herhangi bir UTF-8 karakteri bir anahtar içinde kullanılabilir; bir iki istisna aşağıda listelenmiştir:
a)”\0” karakteri anahtar içinde kullanılamaz, çünkü bu karakter bir anahtar sonunu belirtmek üzere MongoDB tarafından kullanılmıştır.
b) “.” ve “$” karakterleri sadece bazı özel durumlarda kullanılır daha sonra açıklanacaktır.
MongoDB, hem tipe duyarlıdır (type sensitive) hem de büyük - küçük harf ayrımı yapar (case sensitive). Örneğin,
{“mbo”:5} ile {“mbo”:”5”} farklı dokümanlardır, çünkü 5 değeri birinde integer diğerinde ise “5” string olarak saklanmıştır. Aynı şekilde,
{“mbo”:5} ile {“Mbo”:5} de birbirinden farklıdır.
MongoDB’de bir dokümanda aynı anahtar birden çok kullanılamaz. Örneğin aşağıdaki doküman geçersizdir:
{“mbo”: 5, “mbo” : ”5” }
Bir koleksiyonun bir dokümanlar grubu olduğunu söylemiştik. Bir doküman bir satır ile eşleştirilirse koleksiyon da tablo ile eşleştirilebilir.
İSİMLENDİRME
Bir koleksiyon, ismi ile belirlenir. Koleksiyon isimleri UTF-8 string’lerinden oluşur. Bazı istisnalar aşağıdadır:
a) Boş string(“ “) bir koleksiyon adı olamaz.
b) ”\0” karakteri koleksiyon adı içinde kullanılamaz; çünkü bu karakter koleksiyon adının son karakteri olarak MongoDB tarafından rezerve edilmiştir.
c) ”system.” öneki ile başlayan koleksiyon adı olamaz.
d) Kullanıcı tarafından oluşturulan koleksiyon adlarında “$” sembolü bulunmamalıdır.
KOLEKSİYON GRUPLARI OLARAK VERİ TABANLARI
Mongo DB, dokümanları koleksiyonlar halinde birleştirdiği gibi, koleksiyonları da veritabanları içinde toplayabilmektedir. MongoDB’nin her örneği çok sayıda veritabanı içerebilir; her veri tabanı 0 ya da daha çok sayıda koleksiyondan oluşur. Her veritabanının kendine ait yetkileri vardır ve her veritabanı ayrı bir dosya içinde saklanır. Deneysel olarak en iyi tavsiye edilecek metot her uygulama için bir veritabanı kullanmaktır. Ayrı veritabanları farklı uygulamalar ve kullanıcılar için uygun olabilir.
VERİ TABANI İSİMLERİ
Koleksiyonlarda olduğu gibi, veritabanları da bir isim ile saklanır. Veritabanı isimleri de UTF-8 karakterlerinden oluşur.
Koleksiyonlarda olduğu gibi, “” boş string veri tabanı ismi olarak kullanılamaz.
/, \, ., ”, *, <, >, :, |, ?, $, tek boşluk gibi karakterler veri tabanı isminde kullanılmamalıdır.
Aynı şekilde “\0” karakteri de veritabanı isminde kullanılmamalıdır.
Veri tabanı isimleri büyük - küçük harf ayrımı yapılan (case sensitive) isimlerdir. Case sensitive olmayan dosya sistemlerinde bile bu kural geçerlidir. Pratik olarak dosya isimleri için küçük harfler kullanımı tavsiye edilir.
Veritabanı isimleri maksimum 64 byte ile sınırlıdır.
Veritabanı isimleri kullanılan dosya sistemindeki dosya adları gibi sonlanırlar, o yüzden pek çok kısıt söz konusudur. Bunun dışında bazı reserve edilmiş veri tabanı isimleri mevcuttur, bunlara özel bir semantic ile erişebilirsiniz. Bunlar aşağıda listelenmiştir.
REZERVE EDİLMİŞ VERİ TABANI İSİMLERİ
admin
Kök (root) veritabanıdır. Bir kullanıcı admin’e bir şekilde eklenirse, bütün veritabanları için bütün erişim haklarını miras alır. Ayrıca sadece admin’den uygulanabilen bazı komutlar mevcuttur; örneğin sistemdeki bütün veri tabanlarının listelenmesi ya da sunucunun kapatılması gibi.
local
Bu veritabanı hiçbir zaman kopyalanamaz ve sadece tek bir sunucuda lokal olarak saklanması gereken koleksiyonları depolamak için kullanılabilir.
config
MongoDB’nin bazı özel durumlarda kullanımı için config veri tabanından faydalanmak gerekir.
namespace
Bir veritabanı içinden erişilebilen bir koleksiyon adının başına veritabanı adı eklenirse bu yapıya namespace adı verilir. Örneğin opt adlı veri tabanı, blog.methods adlı bir koleksiyon içeriyorsa opt.blog.methods bir namespace oluşturur. Namespace uzunlukları en fazla 121 byte olabilir pratikte 100 byte’tan az olması tavsiye edilir.
MongoDB’Yİ YÜKLEME VE MongoDB İLE ÇALIŞMAYA BAŞLAMA
http://www.mongodb.org/downloads adresine erişirseniz aşağıdaki sayfa gelecektir. Buradan işletim sisteminize uygun alternatifi seçerek ve gerekli adımları izleyerek MongoDB’yi bilgisayarınıza yükleyebilirsiniz:
MongoDB, hemen hemen her zaman bir ağ sunucusu olarak çalışır; istemciler ona erişerek gerekli işlemleri gerçekleştirirler.
MongoDB SUNUCUSUNU BAŞLATMAK (MAC OS X)
MongoDB sunucusunu başlatmak için, mongod dosyasını çağırmanız gerekir. Bunun için; Terminal uygulamasını çalıştırarak Mongo DB’nin yüklü olduğu dizine girelim;
Ozans-MacBook-Pro:~ ozanuysal$ cd mongodb_2.6.5/
Ozans-MacBook-Pro:mongodb_2.6.5 ozanuysal$ cd bin
bin dizinine girdikten sonra ./mongod komutunu girip enter’a basarsak aşağıdaki ekran gelecektir;
sh-3.2# ./mongod
./mongod --help for help and startup options
2015-02-23T19:11:55.545+0200 [initandlisten] MongoDB starting : pid=5895 port=27017 dbpath=/data/db 64-bit host=Ozans-MacBook-Pro.local
2015-02-23T19:11:55.545+0200 [initandlisten] db version v2.6.5
2015-02-23T19:11:55.545+0200 [initandlisten] git version: e99d4fcb4279c0279796f237aa92fe3b64560bf6
2015-02-23T19:11:55.545+0200 [initandlisten] build info: Darwin bs-osx108-1 12.5.0 Darwin Kernel Version 12.5.0: Sun Sep 29 13:33:47 PDT 2013; root:xnu-2050.48.12~1/RELEASE_X86_64 x86_64 BOOST_LIB_VERSION=1_49
2015-02-23T19:11:55.545+0200 [initandlisten] allocator: system
2015-02-23T19:11:55.545+0200 [initandlisten] options: {}
2015-02-23T19:11:55.550+0200 [initandlisten] journal dir=/data/db/journal
2015-02-23T19:11:55.551+0200 [initandlisten] recover : no journal files present, no recovery needed
2015-02-23T19:11:55.765+0200 [initandlisten] waiting for connections on port 27017
DEFAULT VERİ DİZİNİ
Mongo veritabanını ilk defa çalıştırıyorsanız, veri dizini oluşturulmadı uyarısı ile karşılaşabilirsiniz. MongoDB standart olarak /data/db dizinini kullanır. Eğer data dizini mevcut değilse ya da yazılabilir (writable) özellikte değilse sunucu aşağıdaki hata mesajını verecektir.
2015-02-23T19:13:23.560+0200 [initandlisten] options: {}
2015-02-23T19:13:23.560+0200 [initandlisten] exception in initAndListen: 10309 Unable to create/open lock file: /data/db/mongod.lock errno:13 Permission denied Is a mongod instance already running?, terminating
2015-02-23T19:13:23.560+0200 [initandlisten] dbexit:
2015-02-23T19:13:23.560+0200 [initandlisten] shutdown: going to close listening sockets...
2015-02-23T19:13:23.560+0200 [initandlisten] shutdown: going to flush diaglog...
2015-02-23T19:13:23.560+0200 [initandlisten] shutdown: going to close sockets...
2015-02-23T19:13:23.560+0200 [initandlisten] shutdown: waiting for fs preallocator...
2015-02-23T19:13:23.560+0200 [initandlisten] shutdown: lock for final commit...
2015-02-23T19:13:23.560+0200 [initandlisten] shutdown: final commit...
2015-02-23T19:13:23.560+0200 [initandlisten] shutdown: closing all files...
2015-02-23T19:13:23.560+0200 [initandlisten] closeAllFiles() finished
2015-02-23T19:13:23.560+0200 [initandlisten] shutdown: removing fs lock...
2015-02-23T19:13:23.560+0200 [initandlisten] couldn't remove fs lock errno:9 Bad file descriptor
2015-02-23T19:13:23.560+0200 [initandlisten] dbexit: really exiting now
Bu durumda,
mkdir -p /data/db/
komutu ile disk üzerinde /data/db dizinini oluşturmalısınız. Ayrıca MongoDB başlatılmadan kullanıcının bu dizine yazma hakkının olduğundan da emin olmalısınız.
Aşağıda bizim bilgisayarımızdaki /data/db/ dizini ve içeriği görülmektedir:
Ozans-MacBook-Pro:db ozanuysal$ pwd
/data/db
Ozans-MacBook-Pro:db ozanuysal$ ls -l
total 163840
drwxr-xr-x 2 root wheel 68 Feb 23 19:13 journal
-rw------- 1 root wheel 67108864 Feb 23 19:13 local.0
-rw------- 1 root wheel 16777216 Feb 23 19:13 local.ns
-rwxr-xr-x 1 root wheel 0 Feb 23 19:13 mongod.lock
Ozans-MacBook-Pro:db ozanuysal$
MongoDB’yi başlattığınızda sunucu, bazı sürüm (version) ve sistem bilgilerini yazacak ve istemci bağlantıları için bekleyecektir. Standart olarak MongoDB, socket bağlantılarını 27017 portunda dinlemektedir. Port uygun değilse sunucu başlayamayacaktır. Bunun başlıca sebebi portun başka bir socket uygulaması tarafından meşgul edilmesidir (Ör. başka bir MongoDB).
MongoDB durumunu web tarayıcınız ile takip etmek isterseniz, ./mongod –httpinterface komutuyla 28017 portu üzerinden erişebileceğiniz bir ara yüzü başlatabilirsiniz.
http://localhost:28017
adresine girdiğinizde veritabanının durumuyla ilgili çeşitli bilgilere ulaşabilirsiniz. Production sistemlerinde bu özellik kapalı gelmektedir ve eğer açılırsa bu portun bir Firewall ile güvenlik altına alınması tavsiye edilmektedir.
MongoDB SHELL
MongoDB, JavaScript Shell ile birlikte yüklenir; bu sayede komut satırından Mongo DB sunucunuzu yönetebilirsiniz.
SHELL’İ ÇALIŞTIRMAK
Shell’i çalıştırmak için mongo komutunu girmek gerekir:
Ozans-MacBook-Pro:~ ozanuysal$ cd mongodb_2.6.5/bin
Ozans-MacBook-Pro:bin ozanuysal$ ./mongo
MongoDB shell version: 2.6.5
connecting to: test
>
Mongo komutunu girdiğinizde yukardaki ekran gelecektir. Shell ayrıca otomatik olarak MongoDB sunucusuna bağlanmayı test etmek ister. Shell JavaScript yorumlayıcısının (interpreter) tüm özelliklerini taşır dolayısı ile JavaScript programlarını çalıştırabilir. Bunu test etmek için bazı çok basit matematiksel işlemlerle başlayabiliriz:
> a=400
400
> b=a/50
8
> v=Math.pow(b,3)
512
> c=Math.sqrt(121)
11
>
Yukarda kolayca izlediğiniz gibi basit aritmetik işlemler yanında, JavaScript’in fonksiyon kütüphanesini kullanarak karekök alma, bir sayının üssünü hesaplama gibi işlemleri de gerçekleştirebilirsiniz.
sqrt - Karekök hesaplama fonksiyonudur. Math.sqrt(x) ifadesi ‘ i hesaplayacaktır.
Pow - Üs alma fonksiyonudur. Math.pow(a,b) ifadesi, ab fonksiyonunu hesaplayacaktır.
JavaScript FONKSİYONLARINI ÇAĞIRMA
Matematiksel fonksiyonlar dışında, JavaScript’in çeşitli uygulama alanları ile ilgili çok faydalı hazır fonksiyonları mevcuttur. Örneğin, Date fonksiyonu ile tarih türünde veri üretebilirsiniz:
> tarih=new Date("2014/2/2")
ISODate("2014-02-01T22:00:00Z")
> tarih
ISODate("2014-02-01T22:00:00Z")
>
Ayrıca bir string’i başka bir string ile değiştiren replace fonksiyonunu kullanabilirsiniz:
> "Android isletim sistemi".replace("Android","iOS")
iOS isletim sistemi
>
Ayrıca kullanıcı tarafından tanımlanmış (user defined) JavaScript fonksiyonları üretebilir ve kullanabilirsiniz:
> function topla(n,a) { return a+n; }
> topla(5,12)
17
Burada topla adlı kullanıcı tarafından tanımlanmış bir fonksiyon oluşturulmakta ve kullanılmaktadır. topla fonksiyonu a ve n adlı iki parametre değerine sahiptir ve çağrıldığı zaman bunların toplamını göndermektedir. Yukardaki örnekte n=5 ve a=12 olup sonuç 5+12=17’dir.