DevVeri.com

Boğulacaksan büyük veride boğul!

MongoDB NoSQL Veritabanı

MongoDB döküman tabanlı bir NoSQL veritabanı sistemidir (bkz: NoSQL nedir?). MongoDB yapısal verileri JSON benzeri dökümanlarlarda (BSON = Binary JSON) tutar. Her türlü sorgulama ve yönetim işleri JavaScript formatında yapılır.

MongoDB  2007 yılında 10gen firması tarafından geliştirilmeye başlandı. Şu anda 2.0.5 sürümüyle oldukça stabil hale gelmiş durumda ve foursquare, Craigslist, MTV Networks gibi birçok büyük firma tarafından ciddi şekilde kullanılmakta. MongoDB ücretsiz olarak sitesinden indirilip kullanılabiliyor. Bunun dışında 10gen firmasından ticari sürümünü, danışmanlık ve eğitimini almak mümkün.

Arşivleme ve loglama uygulamalarında, dinamik veriyapısı ihtiyacı duyan sistemlerde, yüksek miktarda veri okuma ve yazma ihtiyacı olan uygulamalarda, ilişkisel olmayan basit veri yapılarında RDBMS yerine MongoDB kullanmak daha uygun olabilir.

Diğer NoSQL çözümleri ile karşılaştırıldığında MongoDB barındırdığı özellikler ile öne çıkıyor. Bu özellikleri şöyle özetleyebiliriz:

  • Sorgu (query) desteği sayesinde RDBMS’lerde olduğu gibi istenilen alanlara göre, belirli aralıklara göre (range query) ve düzenli ifadelerle (regular expression) sorgu yazılabiliyor. Birçok NoSQL çözümü sadece anahtarlar (key) üzerinden veri sorgulamasına izin verdiğinden bu çok önemli bir avantaj.
  • İstenilen alanlara göre sorgu yapabilen MongoDB ayrıca bu alanlara indeks (secondary index) oluşturarak daha performanslı çalışabilme imkanı sağlıyor.
  • MongoDB ölçeklenebilirliği sağlamak için Master-Slave Replication desteği sunuyor. Bu modelde yazma işlemleri master sunucuya yapılırken okuma işlemleri slave sunuculardan yapılarak ölçeklendirme sağlanıyor. Master sunucuya herhangi bir şekilde erişilemez ise slave sunuculardan birisi yeni master olarak çalışmaya başlıyor ve sistem kesintisiz bir şekilde devam edebiliyor.
  • MongoDB’nin en güzel özelliklerinden birisi de Sharding (bkz: MongoDB’de Sharding). Bu özellik sayesinde büyük miktardaki veri sunucular arasında paylaştırılıp yükün dağıtılması sağlanabiliyor. Replication özelliği ile birlikte kullanıldığında MongoDB NoSQL’in gücünü ortaya koyuyor.
  • MongoDB üzerindeki verileri işlemek için MapReduce desteği de sunuyor. Bu sayede büyük miktardaki veriyi kolay bir şekilde işlemek mümkün hale geliyor. (bkz: MapReduce nedir?)
  • C, C++, C#, Java, PHP, Python, Erlang birçok dil için sürücü (driver) desteği sunuyor. Bu kütüphaneler gerçekten basit ve güzel tasarlanmış. Hızlı bir şekilde hemen geliştirmeye başlayabiliyorsunuz.

MongoDB’de veriler Document‘lar halinde Collection‘lar içerisinde bulunur. Veri yapısı açısından RDBMS sistemlerle karşılaştırıldığında Collection tabloya, bir Document ise tablodaki bir satıra denk gelir diyebiliriz. Ancak bir tablo içerisindeki kolonlar aynı iken bir Collection içerisindeki farklı Document’lar farklı alanlar barındırabilir.

RDBMS MongoDB
Database db
Table Collection
Row Document
Column Field

Örneğin RDBMS sistemindeki bir tablodaki tüm kayıtlar aynı kolonları barındırır:

Last Name First Name Age
DUMONT Jean 43
PELLERIN Franck 29
Doe John null

MongoDB’de ise bir Collection farklı alanlar içeren Document’lar barındırabilir:

{
    "_id": ObjectId("4efa8d2b7d284dad101e4bc9"),
    "Last Name": "DUMONT",
    "First Name": "Jean",
    "Age": 43
},
{
    "_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
    "Last Name": "PELLERIN",
    "First Name": "Franck",
    "Age": 29,
    "Address": "1 chemin des Loges",
    "City": "VERSAILLES"
}

Tanımları netleştirmek adına;

Definition Example
Key “City”
Value “VERSAILLES”
Key-Value Pair “City’:’VERSAILLES”
Document {_id”: ObjectId(“4efa8d2b7d284dad101e4bc9”), “Last Name”: “DUMONT”, “First Name”: “Jean”, “Age”: 43 }
Collection {_id”: ObjectId(“4efa8d2b7d284dad101e4bc9”), “Last Name”: “DUMONT”, “First Name”: “Jean”, “Age”: 43 },
{“_id”: ObjectId(“4efa8d2b7d284dad101e4bc7”), “Last Name”: “PELLERIN”, “First Name”: “Franck”, “Age”: 29, “Address”: “1 chemin des Loges”, “City”: “VERSAILLES”}

MongoDB’de her dökümanın benzersiz bir kimlik alanı (unique id) olmak zorundadır ve bu alan _id olarak belirlenmiştir. Eğer _id alanına bir değer verilmez ise MongoDB otomatik olarak buraya ObjectId tipinde benzersiz bir kimlik atar.

RDBMS’lerden farklı olarak db veya Collection oluşturmak için özel bir CREATE, ALTER gibi bir işlem yapmaya gerek yoktur. İlgili db seçilerek ve Collection’a veri girilince otomatik olarak oluşturulurlar. RDBMS ile detaylı karşılaştırmaya buradan ulaşabilirsiniz.

MongoDB yönetimi için çok detalı bir konsol uygulaması barındırmakta. Bunun dışında üçüncü parti görsel yönetim araçları da mevcut. Fakat konsol ile her türlü işlem yapılabiliyor. Konsola bağlandıktan sonra help komutu ile yardım almak mümkün:

Hakan-Ilters-MacBook-Pro:bin haqen$ ./mongo localhost:27001
MongoDB shell version: 2.0.1
connecting to: localhost:27001/test
> help
	db.help()                    help on db methods
	db.mycoll.help()             help on collection methods
	rs.help()                    help on replica set methods
	help admin                   administrative help
	help connect                 connecting to a db help
	help keys                    key shortcuts
	help misc                    misc things to know
	help mr                      mapreduce

	show dbs                     show database names
	show collections             show collections in current database
	show users                   show users in current database
	show profile                 show most recent system.profile entries with time >= 1ms
	show logs                    show the accessible logger names
	show log [name]              prints out the last segment of log in memory, 'global' is default
	use                 set current database
	db.foo.find()                list objects in collection foo
	db.foo.find( { a : 1 } )     list objects in foo where a == 1
	it                           result of the last line evaluated; use to further iterate
	DBQuery.shellBatchSize = x   set default number of items to display on shell
	exit                         quit the mongo shell

use mydb komutuyla istediğimiz veritabanını seçiyoruz.

> use mydb
switched to db mydb

Örnek birkaç döküman oluşturmak ve sorgulamak için:

> j = { name : "mongo" };
{"name" : "mongo"}
> t = { x : 3 };
{ "x" : 3  }
> db.mydb.save(j);
> db.mydb.save(t);
> db.mydb.find();
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
>

Belirli bir alana göre sorgu yapmak istediğimizde ise aşağıdaki gibi bir syntax kullanıyoruz:

> db.mydb.find({name:"mongo"}).forEach(printjson);
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }

İlerleyen zamanlarda MongoDB ile ilgili daha detaylı bilgilere sitemizden ulaşabileceksiniz.

Kaynaklar:
http://en.wikipedia.org/wiki/MongoDB
http://www.mongodb.org/display/DOCS/Tutorial

, ,

5 thoughts on “MongoDB NoSQL Veritabanı

  • Furkan dedi ki:

    öncelikle yazı için teşekkürler. benim bir isteğim ve sorum olacaktı. mongodb yi gerekli dosyaları oluşturup kurduğumda data klasöründe local0 adında 1 GB lık bir dosya oluşturdu. bu dosyayı ne için kullanıyor? ve daha yeni başladım çok deneyimli değilim ama sanki verileri tutarken mysql e göre daha fazla alan kaplıyor gibi geldi. normalde boyle mi yoksa bende mi bi sorun oluştu acaba 🙂 ve son olarak isteğim; bu mongodb ve cassandra yı c# ve php’de ( özellikle php’de :)) nasıl kullanılabileceğini gösterebilir misiniz?

    • Halil dedi ki:

      mongodb gb olarak fazla yer kaplıyor. bu bence ilk başta free host ile başlayanlar için bir dert mesela mongohq yada mongolab bedava olarak az yer veriyorlar.

      mongonun yapısı da eğer osman adında bir database’niz varsa bunun için data klasöründe öncelikle 128mb boyutunda osman.0 sonra 256mb osman.1 veri büyüdükçe 512mb osman.2 ve 1gb gibi katlanarak artan dosyalar oluşturuyor, bunun nedeni de önceden diskte yer parsellemek(allocating:)

      bir de mongod yi başlattığınızda kendisi için journal ve şimdi hatırlamadığım bir isimde toplam 2 adet 1gb dosyada oluşturuyor.

      ben test için 3 replikalı 3 sharding server yani toplam 9 server başlattım database bomboş olmasına rağmen 6gb yer parselleyiverdi 🙂

  • Yunus dedi ki:

    Gerçekten yararlı bir döküman olmuş teşekkürler.. MongoDB ilerleyen zamanlarda web in vazgeçilmezi olacak gibi görünüyor..

  • vural dedi ki:

    Yararlı Bir yazı olmuş tebrikler

  • muhammet dedi ki:

    indirmek için yardım edin hiç bi site bulamadım

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.