Linux işletim sistemine MongoDB kurulumu için öncelikle MongoDB repolarını işletim sistemine eklemeniz gerekmekte.
Linux Redhat / CentOS
1. Adım: /etc/yum.repos.d/mongodb-org.repo dosyasının içerisine aşağıdaki bilgileri eklemeniz gerekmekte. Şu anda son sürüm 4.0 daha sonra farklı bir sürüm çıkarsa eğer o sürüme ait olan repoyu eklemeniz gerekecektir. Güncel MongoDB sürümünü bu bağlantıdan öğrenebilirsiniz.
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
2. Adım: Kurulum
yum install -y mongodb-org
Ubuntu
1. Adım: MongoDB servisine ait public key bilgisini işletim sistemine import etmemiz gerekiyor
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
2. Adım: /etc/apt/sources.list.d/mongodb-org.list dosyasının içerisine aşağıdaki bilgileri eklememiz gerekmekte.
Ubuntu 14.04 için
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
Ubuntu 16.04 için
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
3. Adım: Paketleri güncelle
sudo apt-get update
4. Adım: Kurulum
sudo apt-get install -y mongodb-org
Konuya CentOS üzerinden devam edeceğim. Kurulum işlemi sonrasında service mongod start komutunu vererek servisi başlatabilirsiniz. MongoDB kurulumu tamamlandı ve kullanıma hazır durumda terminal üzerinden mongo komutunu vererek MongoDB'nin shell ekranına giriş yapabilirsiniz. MongoDB daha &ou
MongoDB bir NoSQL veritabanıdır. NoSQL "not only sql" olarak da açılabilir, yani SQL değil anlamındadır. Çünkü çalıştırılan sorgular bir MySQL ya da MsSQL sistemlerinde alışmış olduğunuz sorgular değiller.
NoSQL Sistemlerinin Avantajları Nelerdir?
Okuma ve yazma konusunda diğerlerine göre daha performanslı olabilirler.
Yatay olarak genişletilebilirler. Yani binlerce sunucu küme oluşturarak çalıştırılabilir ve daha büyük veriler üzerinde daha rahat işlem yapılabilir.
Farklı bir çok özellikleri olması sebebiyle programlama alanında kolaylıklar sağlar.
Maliyet olarak diğer veritabanı sistemlerine göre daha avantajlıdır.
NoSQL Sistemlerin Dezavantajları Nelerdir?
SQL bir veritabanı kullanan uygulamanın NoSQL sisteme taşınması ilk aşamada zor olacaktır. Özellikle join kullanan sorgularda düzenleme yapılması gerekecektir.
NoSQL veritabanı sitemleri veri güvenliği konusunda SQL veritabanlarındaki gibi gelişmiş bir yapıya sahip değiller.
MongoDB'de yukarıdaki dezavantajlarda bahsettiğim gibi güvenlik konusunda ilk kurulumda yetersiz kalmakta. Varsayılan olarak kullanıcı adı ve şifre bulunmamakta. Doğrudan sunucu adresini yazarak veritabanına bağlantı sağlanabilmekte. Bu sebeple veritabanı erişimini sunucu dışına kapatmak gerek ve MongoDB konfigurasyonlarını düzenleyerek kullanıcı yetkilendirmesini açmanız gerek. Kurulum ve konfigurasyonları sonraki konumda açıklayacağım.
MongoDB
10gen firması tarafından 2007 yılında başlanan ve 2009 yılında AGPL lisansıyla açık kaynak projesine dönüştürülen bir veritabanı sistemidir. Belge yönelimli veritabanı olarak tanıtılmaktadır. (Document oriented). MongoDB üzerinde oluşturulan her kayıt bir dökümandır. Bu dökümanlar json formatında saklanır.
MongoDB ve alışılagelmiş S
C# ta veritabanında sorgu çalıştırabilmemiz için SqlCommand komutunu kullanırız, ben örneğimize MySql üzerinden devam edeceğim için MySqlCommand komutunu kullanacağım.
Yeni bir windows form uygulaması başlatıp, iki buton bir de listview ekliyoruz. Butonun birine "Bilgileri Getir" diğerini "Bilgiyi Sil" isimlerini veriyoruz.İlk önce veritabanı bağlantımızı yapmak için bağlantı komutlarımızı yapıp bağlantıyı açıyoruz.
MySqlConnection baglanti = new MySqlConnection("server=localhost; userid=root; password=root; database=cryptograph");
Bilgileri Getir ismini verdiğimiz butonun click olayına hata kontrol komutlarımızı kullanarak bağlantımızı açıyoruz ve veriler çekmek için gerekli komutlarımızı yazıyoruz.
try
{
baglanti.Open();
MySqlCommand sorgu = new MySqlCommand("SELECT * FROM blog ORDER BY id DESC", baglanti);
MySqlDataReader oku = sorgu.ExecuteReader();
while (oku.Read())
{
listView1.Items.Add(oku["blog_baslik"].ToString());
}
}
catch (Exception hata)
{
MessageBox.Show(hata.ToString(), "Hata");
}
finally
{
baglanti.Close();
}
MysqlCommand komutu ile sorgu isminde bir nesne tanımladık ve sql sorgumuzu belirtip hangi bağlantıyı kullanacağını belirttik.SELECT * FROM blog ORDER BY id DESC sql sorgumuz, burada blog isimli tablodan verilerin id alanına gire tersten sıralanacak şekilde getirilmesini istedik.MysqlDataReader ile bir data reader nesnesi oluşturduk, yani veritabanından bilgileri okuyacak olan nesne, oku isimli nesneye sorgu.ExecuteReader(); bu komut ile bilgiyi nereden okuyacağını belirttik, sorgu isimli nesneden alacak bilgiyi.Daha sonra bunu döngüye sokarak listview içine ekledik veriyi. Try içerisinde gerçekleşen sorgular bittiğinde finally içerisindeki sorgu çalıştırılır, yani durum gerçekleşse de gerçekleşmese de en sonda yapılacak işlem burada belirtiliyor,
C#'ta SQLServer bağlantısı için isim uzayı olarak SqlClient'ı çağırmamız gerekiyor (using System.Data.SqlClient;), veya başka bir veritabanı için hangi isim uzayı gerekiyorsa onu çağırırız. Mysql için net connector kuruluysa eğer using MySql.Data.MySqlClient; kullanırız.
Bağlantı komutları: SqlConnection, eğer mysql kullanacaksak MySqlConnection. Dikkat ederseniz komutun başına sadece My eki geldi. Ben örneğime MySql üzerinden devam edeceğim.
MySqlConnection baglanti = new MySqlConnection("server=localhost; userid=root; password=root; database=cryptograph");
MysqlConnection komutu ile baglanti isminde bir nesne oluşturuyoruz, eşitlikten sonra parantez içinde veritabanı bilgilerimizi yazıyoruz.Server veritabanımızın bulunduğu yer, userid veritabanı kullanıcısının adı, password veritabanı kullanıcısının şifresi, databasede ise veritabanımızın adı tanımlanıyor.
Şimdi sadece baglanti isminde bir nesne tanımladık, bu bağlantıyı açmadık. Bağlantıyı açmak için baglanti.Open(); komutunu kullanıyoruz. Bu şekil bir kullanımda eğer bağlantıda sorun yaşanırsa program hata verir ve çalışması durur. Bu gibi durumlarda try-catch hata kontrol komutları kullanırız.
try{
baglanti.Open();
MessageBox.Show("Bağlantı açıldı");
}
catch (Exception hata){
MessageBox.Show(hata.ToString(),"Hata");
}
Bağlantı açıldığı durumda ekrana Bağlantı açıldı uyarısı verecek, bağlantının hatalı olduğu durumda ise ekrana hata kodu ile birlikte hata mesajını verecektir.
Bağlantıyı kapatmak içinse baglanti.Close(); komutunu vermemiz gerekecektir.
Örnek dosyayı buradan indirebilirsiniz
Veri tabanından
bilgi çekmek için SELECT komutunu
kullanırız. SELECT * FROM tablo_ismi
şeklinde bir komut ile tablo_ismi isimli tablodan bilgimizi çekeriz, eğer bir
şarta bağlı olarak çekeceksek WHERE ile
şartımızı belirtiriz.
SELECT * FROM blog WHERE id=1 blog isimli tabloda id değeri 1 olan bilgiyi getirir ekrana. Id değeri
bir olan konunun bir de kategori bilgisi var kategoriler tablosunda, ayrıca
konuyu açan kişinin de bilgisi profil tablosunda hepsi için ayrı ayrı sorgu çalıştırmaktansa tek bir sql sorgusu ile
hepsini getirebiliriz.
Kategori tablosunda
k_id ve kat_isim adında alanlar var, kategori ismi ve id bilgisini tutan
alanlar.
Profil tablosunda
p_id, kullanici_adi adında alanlar var i, kullanıcı adı ve kullanıcının id
bilgisini tutan alanlar.
Blog tablosunda id,
blog_baslik, blog_icerik, kat_id, kullanici_id adında alanlar var, konunun id
bilgisi, içerik ve başlık bilgisi, konuyu açan kullanıcının id bilgisi ve hangi
kategoride bulunuyorsa onun id bilgisini tutan alanlar.
Tek sorguda bunları
getirebilmek için şu komutu kullanıyoruz;
SELECT * FROM blog b INNER JOIN profil p ON b.kullanici_id = p.p_id INNER JOIN blog_kategori bk ON b.kat_id=bk.k_id INNER JOIN sosyal s ON p.p_id=s.kullanici_id WHERE b.id=1
Blog isimli tabloyu
seçtik ve bu tablo ismini b isimli bir değişkene atadık, sonra bunun aynısını
diğer tablolar içinde yaptık.
b.kat_id=bk.k_id
ile blog isimli tablodaki kat_id alanıyla blog_kategori isimli tablodaki k_id
alanını birleştirmiş olduk blog tablosunda tutulan kategori id si ne ise
kategoriler tablosundaki o id ye sahip olan kategorinin bilgileri gelecek, aynı
şey profil tablosu içinde geçerli, b.kullanici_id=p.p_id blog tablosundaki
kullanıcı id bilgisi ile profil tablosundaki id bilgisi birbirine bağlanarak
bilgi çekilmiş. Bu şekil bir kullanım yapmasaydık eğer her biri için ayrı ayrı
sorg