Web Programlama

Web Programlama

MongoDB Kurulumu

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

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.