Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Önsel Akın
Önsel Akın
http://nslkn.com
İletişme geçmek için tıklayın.
8 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: Apache ASP.NET MVC CouchDB JSON LINQ MongoDB MVC2 NoSQL RavenDB REST Genel Önsel Akın
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : Genel
Yayınlanma Tarihi : 27.7.2010
Okunma Sayısı : 69298
Yorum Sayısı : 9     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 14.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 14.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 14.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 14.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
NoSQL ve MongoDB
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon

Özellikle geçtiğimiz sene tam anlamıyla atağa geçmiş olan NoSQL veritabanı sistemleri ile bir süredir ben de ilgileniyorum. Şu sıralarda Ayende Rahien'in de üzerinde çalıştığı RavenDB projesini gördükten sonra konuyla ilgili daha çok bilgi sahibi olmak istedim. Bu postada ve devam eden ileriki postalarda konuyla ilgili edindiğim bilgileri kod örnekleri de vererek sizlerle paylaşacağım. Önce NoSQL nedir ne yapar kısaca bakalım.

NoSQL hakkında

En kısa tanımıyla (ki en başta beni şoka uğratan tanımdır :) ) herhangi bir şema formatında ve "ilişkisel olmayan" verileri depolayabileceğiniz veritabanı sistemlerine kavramsal olarak verilen isimdir. "Hiç SQL kullanılmayan" anlamından çok "Sadece SQL kullanılmayan" anlamı barındırmaktadır (Not-only-SQL). Ayrıca şu ana kadar geliştirilmiş olan örneklerin gerçekten çok yüksek performansa sahip olduklarını da eklemek gerek. NoSQL veritabanı özelliklerini;

  • SQL sorgulama arayüzü ve bildiğimiz SQL sorguları ile çalışmıyor olmaları (Sorgulama arayüzleri değişkenlik gösteriyor. JSON, REST, RPC vb.. şeklinde farklı API'lerle sorgulanabilen versiyonlar mevcut. RavenDB ise tamamen LINQ ile sorgulanabiliyor!)
  • Çok-ögeli (tuple) sabit ilişkisel şemalar yerine veri tipleri önceden belirlenmemiş ve genişletilebilir veri şeması kullanıyor olmaları
  • Özellikle yatay ölçeklendirmeye göre tasarlanmış olmaları (Facebook, Google, Amazon gibi her gün terabaytlarca veriyle haşır olan devlerin NoSQL veritabanlarını tercih etmesinin ana nedenlerinden)
  • Veriyi disk ya da sadece hafızada taşıyabilir olmaları

şeklinde gruplandırabiliriz. Yukarıda verdiğim bağlantıda göreceğiniz NoSQL veritabanı sistemleri bu dört ana özelliğin farklı varyasyonlarını sergiliyor.

MongoDB

MongoDB, NoSQL veritabanı sistemleri arasında yüksek performansıyla bilinen ve bazı RDBMS özelliklerini (indeksleme vb.) de içinde barındıran bir yazılım. 13MB'lık minik boyutuna rağmen yaptığı işler çok büyük. MongoDB sitesinden kullanıldığı portallerin listesini görüp şaşırabilirsiniz (benim gibi). Şu anda üzerinde çalıştığımız ve haziran sonu gibi tamamlayacağımız bir Open Source projemizde biz de MongoDB kullanıyoruz.

Bu adresten MongoDB 64bit Zip dosyasını indirebilirsiniz. Eğer sisteminiz 32bit ise verdiğim linkte yine bu versiyonu da göreceksiniz. MongoDB üzerinde çalışmak için birkaç farklı C# kütüphanesi var. NoRM ise benim en beğendiklerimden çünkü LINQ ile sorgulamanız ve verilerinizi doküman yerine POCO ile kayıt etmeniz mümkün. db4o ile çalışanlar için ek bilgi: NoRM, MongoDB'ye db4o'daki sorgulama / depolama modeline benzer bir arayüz sağlıyor diyebilirim. Buradan da NoRM'i indirip Visual Studio 2010 ile derleyebilirsiniz. MongoDB zip dosyasını C:\data\db altındaki bir klasöre açın, MongoDB öntanımlı olarak bu klasörde çalışıyor. İsterseniz MongoDB'yi çalıştırırken --dbpath [klasor] parametresi ile farklı bir klasörden de çalıştırabilirsiniz. MongoDB'yi sistemimize kurmuş olduk :) mongod.exe ile veritabanını başlatıyoruz.

NoRM'in nasıl çalıştığını görmek ve API'yi tanıma açısından NoRM.Tests projesi oldukça faydalı. Testleri çalışır hale getirebilmeniz için gerekli olan adımları aşağıda bulabilirsiniz.

1. C:\data\ altında NoRMAuth adında bir klasör oluşturun. NoRM testler için veritabanının bu klasörde bulunmasını istiyor.

2. Sistemiminizin path değişkenine C:\data\db\bin klasörünü ekleyin. (Computer -> Properties -> Advanced system settings -> Environment Variables -> System variables - Path)

3. MongoDB'yi yeni klasörden başlatın (mongod.exe --dbpath C:\data\NoRMAuth)

4. Mongo shell başlatın. (C:\data\db\bin\mongo.exe)

5. Sırasıyla aşağıdaki komutları shell'e girin:

use NoRMAuth;

use admin;

db.addUser('admin', 'admin')

use main;

db.addUser('usr', 'pss')

Bu komutlarla testler için gerekli olan kullanıcıları tanımlamış olduk. Bundan sonrası xUnit ile NoRM.Tests.dll dosyasını açıp testleri çalıştırıp yeşilleri görmeye kalıyor. Bu arada, tüm testler çalışmayacaktır, dert etmeyin. Çalışmayan testlere bakarsanız neden çalışmadıklarını da anlayabilirsiniz.

Şimdi bir Asp.Net Mvc projesi ile MongoDB üzerinde çalışalım. Yazacağım kodun çoğu aslında Linq testleri içerisinde mevcut, burada yapacağım şey bir tür derleme ve testleri bir uygulama haline getirerek mantıksal bir bütünlük sağlamak olacak.

Visual Studio 2010'u başlatarak yeni bir Asp.Net Mvc 2 projesi oluşturun (Visual Studio 2008 de tercih edebilirsiniz). Proje referanslarına NoRM.dll'i ekleyin. Şimdi veritabanında saklamak için bir model tanımlayalım. Models klasörüne yeni bir sınıf ekleyelim. İstediğiniz isimde bir sınıf ekleyebilirsiniz. Ben Recipe adında bir sınıf ekledim (kahvaltı yapmadım henüz..). Sınıfın tanımını yine istediğiniz gibi gerçekleştirebilirsiniz. Benim tanımım aşağıda:

public class Recipe : IIdentifiable
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public DateTime DatePosted { get; set; }
public string Sender { get; set; }
public int TotalVotes { get; set; }
}
 

Recipe sınıfımızın tanımı budur. Id kolonunun ObjectId veri tipinde olduğunu görmüşsünüzdür. NoRM'nin nesneleri belirlemek için kullandığı 16'lık tabanda tanımlanmış olan bir değer bu. Eğer nesneyi kayıt ederken Id değeri vermezseniz NoRM otomatik olarak bir değer sağlayacaktır. Ayrıca sınıf üzerinde IIdentifiable adında bir arayüz uyguladım. Birazdan göreceğiniz generic Session sınıfında Id değeri üzerinden sorgulama yapabilmek için bu arayüzü kontrat olarak kullanıyorum.

NoRM test projesinde LinqTests.cs dosyasına bakarsanız Session adında bir sınıfın veritabanı ile etkileşimde kullanıldığını görebilirsiniz. Tanımlanmış olan Session sınıfı TestProduct adında bir sınıfla çalışacak şekilde kodlanmış. Aşağıda Session sınıfının generic versiyonu mevcut.

public class DBSession : IDisposable where T : IIdentifiable
{
private readonly MongoQueryProvider _provider;

public DBSession()
{
_provider = new MongoQueryProvider("MongoDBApp");
}

public MongoQueryProvider Provider
{
get { return _provider; }
}

public IQueryable Query
{
get
{
return new MongoQuery(_provider);
}
}

public void Dispose()
{
_provider.Server.Dispose();
}

public void Add(T item)
{
_provider.DB.GetCollection().Insert(item);
}

public void Update(T item)
{
/* item.Id diyebilmemizi sağlayan şey Recipe sınıfının IIdentifiable arayüzünü uyguluyor olması */
_provider.DB.GetCollection().UpdateOne(
new { _id = item.Id }, item
);
}
}
 

DBSession nesnemiz MongoDBApp adında bir veritabanı ile etkileşimli olarak çalışacak. Veritabanı henüz yoksa MongoDB veritabanını ilk kullanımda kendisi oluşturacak. Veritabanı mevcut ise bu veritabanı üzerinden çalışmaya devam edecek. Gördüğünüz gibi alışık olduğumuz RDBMS sistemlerinden oldukça farklı (ve güzel!).

Projeye CRUD işlemleri için bir Controller ekleyelim ve Recipe sınıfını kullanarak standart veritabanı işlemlerini gerçekleştirelim.

Controller kodu aşağıdaki şekilde, LINQ bilen birisi için yeni olan pek bir şey yok farkettiğiniz gibi (ki bu da çok güzel bir özellik)

public class RecipeController : Controller
{
public DBSession _session;

public RecipeController()
{
_session = new DBSession();
}

//
// GET: /Recipe/

public ActionResult Index()
{
return View("Index", _session.Query.ToList());
}

//
// GET: /Recipe/Details/5

public ActionResult Details(ObjectId id)
{
var recipe = _session.Query.FirstOrDefault(r => r.Id == id);

if (recipe == null) return RedirectToAction("Index");
return View("Details", recipe);
}

//
// GET: /Recipe/Create

public ActionResult Create()
{
return View("Create");
}

//
// POST: /Recipe/Create

[HttpPost]
public ActionResult Create(Recipe recipe)
{
try
{
if (!ModelState.IsValid)
{
return View("Create");
}

_session.Add(recipe);

return RedirectToAction("Index");
}
catch
{
return View();
}
}

//
// GET: /Recipe/Edit/5

public ActionResult Edit(ObjectId id)
{
return View("Edit", _session.Query.First(r => r.Id == id));
}

//
// POST: /Recipe/Edit/5

[HttpPost]
public ActionResult Edit(Recipe recipe)
{
try
{
_session.Update(recipe);

return RedirectToAction("Index");
}
catch
{
return View();
}
}

//
// GET: /Recipe/Delete/5

public ActionResult Delete(int id)
{
return View();
}

//
// POST: /Recipe/Delete/5

[HttpPost]
public ActionResult Delete(int id, FormCollection collection)
{
try
{
// TODO: Add delete logic here

return RedirectToAction("Index");
}
catch
{
return View();
}
}
}
 

Gördüğünüz gibi MongoDB ile LINQ kullanarak çalışmak gerçekten çok kolay. İhtiyacınız olan tüm API dokümantasyonu ise NoRM ile birlikte gelen test projesi içinde mevcut. Burada göstermediğim ve API'nin esnekliğini ortaya koyan tüm senaryolar testler içinde kodlanmış..

Görüşmek üzere!

Makale:
NoSQL ve MongoDB Genel Önsel Akın
  • Yazılan Yorumlar
  • Yorum Yaz
MAY
5
2016
iyi günler Önsel hocam, mongodb yi Windows 8e kurarken,mongo.exe yi çalıştırırken, başlatma hatası alıyorum. bir çok yol denedim ama bu konu hakkında bir bilgi bulamadım. (errno:10061 hedef makine etkin olarak reddettiğinden bağlantı kurulamadı) bu konuda yardımcı olabilirseniz sevinirim. :-?
MAY
5
2016
iyi günler Önsel hocam, mongodb yi Windows 8e kurarken,mongo.exe yi çalıştırırken, başlatma hatası alıyorum. bir çok yol denedim ama bu konu hakkında bir bilgi bulamadım. (errno:10061 hedef makine etkin olarak reddettiğinden bağlantı kurulamadı) bu konuda yardımcı olabilirseniz sevinirim. :-?
MAY
5
2016
iyi günler Ferhat hocam, mongodb yi Windows 8e kurarken,mongo.exe yi çalıştırırken, başlatma hatası alıyorum. bir çok yol denedim ama bu konu hakkında bir bilgi bulamadım. (errno:10061 hedef makine etkin olarak reddettiğinden bağlantı kurulamadı) bu konuda yardımcı olabilirseniz sevinirim. :-?
MAY
5
2016
iyi günler Önsel hocam, mongodb yi Windows 8e kurarken,mongo.exe yi çalıştırırken, başlatma hatası alıyorum. bir çok yol denedim ama bu konu hakkında bir bilgi bulamadım. (errno:10061 hedef makine etkin olarak reddettiğinden bağlantı kurulamadı) bu konuda yardımcı olabilirseniz sevinirim. :-?
MAY
5
2016
iyi günler Ferhat hocam, mongodb yi Windows 8e kurarken,mongo.exe yi çalıştırırken, başlatma hatası alıyorum. bir çok yol denedim ama bu konu hakkında bir bilgi bulamadım. (errno:10061 hedef makine etkin olarak reddettiğinden bağlantı kurulamadı) bu konuda yardımcı olabilirseniz sevinirim. :-?
MAY
5
2016
iyi günler Önsel hocam, mongodb yi Windows 8e kurarken,mongo.exe yi çalıştırırken, başlatma hatası alıyorum. bir çok yol denedim ama bu konu hakkında bir bilgi bulamadım. (errno:10061 hedef makine etkin olarak reddettiğinden bağlantı kurulamadı) bu konuda yardımcı olabilirseniz sevinirim. :-?
MAY
5
2016
iyi günler Önsel hocam, mongodb yi Windows 8e kurarken,mongo.exe yi çalıştırırken, başlatma hatası alıyorum. bir çok yol denedim ama bu konu hakkında bir bilgi bulamadım. (errno:10061 hedef makine etkin olarak reddettiğinden bağlantı kurulamadı) bu konuda yardımcı olabilirseniz sevinirim. :-?
MAY
5
2016
iyi günler Önsel hocam, mongodb yi Windows 8e kurarken,mongo.exe yi çalıştırırken, başlatma hatası alıyorum. bir çok yol denedim ama bu konu hakkında bir bilgi bulamadım. (errno:10061 hedef makine etkin olarak reddettiğinden bağlantı kurulamadı) bu konuda yardımcı olabilirseniz sevinirim. :-?
MAY
5
2016
iyi günler Ferhat hocam, mongodb yi Windows 8e kurarken,mongo.exe yi çalıştırırken, başlatma hatası alıyorum. bir çok yol denedim ama bu konu hakkında bir bilgi bulamadım. (errno:10061 hedef makine etkin olarak reddettiğinden bağlantı kurulamadı) bu konuda yardımcı olabilirseniz sevinirim. :-?
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor