12 Ocak 2014 Pazar

MongoDB Kullanımı (Çekirdek)

NoSQL kavramı hakkında farkındalık oluşturup, popüler NoSQL çözümü MongoDB’yi size tanıtmayı amaçlayan makalede belirttiğim gibi, MongoDB dokümanyasyonu, kullandığınız platforma(Linux, Mac os x, Windows) MongoDB’yi nasıl kurabileceğinize dair yeterli bilgiyi sunmaktadır.
Kurulumu başarıyla tamamladıysak, artık teoriden pratiğe geçip, çekirdek MongoDB işlemlerini(CRUD operasyonları) gerçekleştirerek ilk kayıtlarımızı oluşturabiliriz.
Konsol
MongoDB, yönetimi için her türlü yeterliliğe sahip konsol uygulaması ile sisteminize kuruluyor. MongoDB yönetim için görsel bir araç barındırmamakla birlikte, bu iş için üçüncü parti çözümler bulunmaktadır.
Konsol yönetimi için öncelikle, birincil arka plan kabuğunu çalıştırmamız gerekiyor.
cs:~ hakdogan$ mongod
Bu komutla MongoDB için arka planda veri isteklerini işleyecek kabuğu çalıştırdıktan sonra, yeni bir konsol ekranında, sistem yöneticilerinin veritabanları üzerinde sorgu, crud ve diğer operasyonları gerçekleştirebilmesi adına tasarlanmış mongo JavaScript kabuğunu çalıştırmalıyız.
cs:~ cs$ mongo
Tam bu noktada, yeni başlayanlar için help komutu ile yardım almak, hangi komutla ne tür operasyonların gerçekleştirildiğini görmek faydalı olacaktır.
> help
	db.help()                    help on db methods
	db.mycoll.help()             help on collection methods
	sh.help()                    sharding helpers
	rs.help()                    replica set helpers
	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 db_name                  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

İlk olarak kurulumla birlikte gelen, varolan veritabanlarının listesine bakalım.
> show dbs
local   0.078125GB
Şimdi bir kullanım senaryosu belirleyelim ve ardından da, crud operasyonlarını gerçekleştireceğimiz collection’ları barındıracak veritabanımızı oluşturalım.
Senaryomuz
Kodcu.com’da yayınlanan makaleleri kategori, başlık, içerik, tarih, yazar, etiket alanlarına sahip dokümanlar(unutmayın, MongoDB’de her kayıt, aslında bir dokümandır) olarak saklamak, bu dokümanların alanları üzerinde sorgulama, güncelleme ve silme işlemlerini gerçekleştirmek.
> use kodcu
switched to db kodcu
MongoDB’de, alışageldiğimiz sql veritabanlarında var olana benzer, veritabanı oluşturmak için bir create komutu bulunmuyor. Böyle bir şeye gerek de yok, çünkü MongoDB create işlemini, tanımladığınız veritabanına kayıt eklediğiniz anda gerçekleştiriyor. Yukarıda yer alan use kodcu komutu ile biz, veritabanı tanımlama işlemini gerçekleştirmiş olduk. Çıktıdan anlaşılabileceği gibi, use komutu ile varolan veritabanları arasında seçim de yapabiliyoruz.
> article  = {
              category: ["Yazılar"], 
              title: "Lean Kanban Atölye Çalışması", 
              content: "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
              date: new Date('2013-04-11'), 
              author: "Altuğ Bilgin Altıntaş", 
              tags: [null]}
{
	"category" : ["Yazılar"],
	"title" : "Lean Kanban Atölye Çalışması",
	"content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.",
	"date" : ISODate("2013-04-11T00:00:00Z"),
	"author" : "Altuğ Bilgin Altıntaş",
	"tags" : [null]
}
> db.articles.save(article)
db.articles.save(article) komutuyla, kodcu veritabanı içinde articles collection‘ını(önceki makalede belirtildiği gibi, MongoDB’de collection‘lar, sql dünyasında tablolara tekabül etmektedir) oluşturduk ve öncesinde tanımladığımız article objesini bu collection’a ekledik. Böylelikle MongoDB’ye ilk kaydımızı(doküman) eklemiş olduk.
Aşağıdaki komutla da aynı sonucu elde ederiz.
db.articles.insert({
                   category: [“Yazılar”], 
                   title: "Lean Kanban Atölye Çalışması", 
                   content: "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
                   date: new Date('2013-04-11'), 
                   author: "Altuğ Bilgin Altıntaş", 
                   tags: [null]})
> show dbs
kodcu	0.203125GB
local	0.078125GB
> show collections
articles
system.indexes
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "category" : [ "Yazılar" ], 
  "title" : "Lean Kanban Atölye Çalışması", 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "tags" : [ null ] 
}
Görüldüğü üzre, kodcu isminde veritabanımız, bu veritabanı içinde de articles isminde bir collection oluşmuş durumda. Collection üzerinde yapılan find() çağrısıyla da, ilgili collection’ın barındırdığı kayıtları çıktılamış olduk. Bu kayıtta bizim manuel girmediğimiz bir değer dikkatinizi çekmiş olmalı, id değeri.
MongoDB’de her bir dokümanın benzersiz/unique bir kimlik alanı vardır. Bu alan _id alanıdır. _id alanına manuel olarak değer atanmadığı takdirde, MongoDB bu alana ObjectId tipinde benzersiz bir kimlik değeri atamaktadır.
Oluşturduğumuz ilk kayıtta tags alanına null değer girdik, bu alanı güncelleyelim.
> db.articles.update({_id:ObjectId("516a93d0b26184f91a8b985c")}, 
                     {$set: {"tags": ["lean","kanban","eğitim"]}})
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
Şimdi yeni kayıtlar ekleyelim ve bu kayıtlar üzerinde sorgular çalıştırmayı görelim.
>db.articles.insert({
                    category: ["Yazılar"], 
                    title: "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
                    content: "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
                    date: new Date('2013-04-10'), 
                    author: "Kodcu.Com", 
                    tags: [null]})

>db.articles.insert({
                    category: ["Java", "Tutorial", "Yazılar", "Yazılım"], 
                    title: "Java ile Apache Solr’a Veri İndeksleme", 
                    content: "Merhabalar, bir önceki yazımda Apache Solr kurulumundan, konfigürasyonundan, komut satırından Solr’a veri indeksleme ve bu veriler üzerinden sorgu yapabilme işlemlerinden bahsetmiştim.", 
                    date: new Date('2013-04-09'), 
                    author: "Cüneyt Yeşilkaya", 
                    tags: ["java", "java ile solr'a veri indekslemek", "solr", "solrj"]})

>db.articles.insert({
                    category: ["NoSQL", "Yazılar"], 
                    title: "Çekirdek MongoDB İşlemleri", 
                    content: "NoSQL kavramı hakkında farkındalık oluşturup...", 
                    date: new Date('2013-04-15'), 
                    author: "Hüseyin Akdoğan", 
                    tags: ["mongodb", "nosql"]})
Şimdi, mevcut kayıtlar içinde, yazarı Altuğ Bilgin Altıntaş olan makaleleri arayalım.
> db.articles.find({author: "Altuğ Bilgin Altıntaş"})
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
Burada daha önce MongoDB’yi diğer NoSQL çözümlerden ayıran ve öne çıkaran hususlardan birisi olarak bahsettiğim, istenilen alana göre sorgulama yapabilme olanağını görmüş olduk. Yine aynı başlık altında belirttiğim gibi, MongoDB kullanıcılarına, sorgularda düzenli ifadelerden(regular expression) yararlanma olanağı da sunuyor. Bu bağlamda, içeriğinde Backbone ve JavaScript ifadeleri yer alan makaleleri bulmak istediğimizde şöyle bir söz dizimi kullanıyoruz.
> db.articles.find({content: {$regex: 'Backbone.*JavaScript'}})
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
MongoDB, düzenli ifadeleri kullanırken yararlanabileceğiniz oldukça yararlı 4 seçenek sunuyor. Bunlardan biri, büyük/küçük harf duyarsız sorgular için kullanılıyor.
> db.articles.find({content: {$regex: 'backbone.*javascript', $options: 'i'}})
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
Son olarak bir kaydı nasıl silebileceğimizi de görelim.
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
{ "_id" : ObjectId("516a943bb26184f91a8b985e"), 
  "category" : [ "Java", "Tutorial", "Yazılar", "Yazılım" ], 
  "title" : "Java ile Apache Solr’a Veri İndeksleme", 
  "content" : "Merhabalar, bir önceki yazımda Apache Solr kurulumundan, konfigürasyonundan, komut satırından Solr’a veri indeksleme ve bu veriler üzerinden sorgu yapabilme işlemlerinden bahsetmiştim.", 
  "date" : ISODate("2013-04-09T00:00:00Z"), 
  "author" : "Cüneyt Yeşilkaya", 
  "tags" : [ "java", "java ile solr'a veri indekslemek", "solr", "solrj" ] 
}
{ "_id" : ObjectId("516a9444b26184f91a8b985f"), 
  "category" : [ "NoSQL", "Yazılar" ], 
  "title" : "Çekirdek MongoDB İşlemleri", 
  "content" : "NoSQL kavramı hakkında farkındalık oluşturup...", 
  "date" : ISODate("2013-04-15T00:00:00Z"), 
  "author" : "Hüseyin Akdoğan", 
  "tags" : [ "mongodb", "nosql" ] 
}

Burada ele alıp, konsol uygulaması üzerinden gerçekleştirdiğimiz işlemleri, MongoDB’nin sürücü desteğinde bulunduğu yazılım dilleriyle gerçekleştirmek de mümkün. Nasip olursa bir sonraki makalede, MongoDB’nin sağladığı native java driver ile burada gördüğümüze benzer işlemlerin nasıl gerçekleştirilebileceğini ele alacağız. twitter/@yasinaktimur

MongoDB Kullanımı (Çekirdek)

NoSQL kavramı hakkında farkındalık oluşturup, popüler NoSQL çözümü MongoDB’yi size tanıtmayı amaçlayan makalede belirttiğim gibi, MongoDB dokümanyasyonu, kullandığınız platforma(Linux, Mac os x, Windows) MongoDB’yi nasıl kurabileceğinize dair yeterli bilgiyi sunmaktadır.
Kurulumu başarıyla tamamladıysak, artık teoriden pratiğe geçip, çekirdek MongoDB işlemlerini(CRUD operasyonları) gerçekleştirerek ilk kayıtlarımızı oluşturabiliriz.
Konsol
MongoDB, yönetimi için her türlü yeterliliğe sahip konsol uygulaması ile sisteminize kuruluyor. MongoDB yönetim için görsel bir araç barındırmamakla birlikte, bu iş için üçüncü parti çözümler bulunmaktadır.
Konsol yönetimi için öncelikle, birincil arka plan kabuğunu çalıştırmamız gerekiyor.
cs:~ hakdogan$ mongod
Bu komutla MongoDB için arka planda veri isteklerini işleyecek kabuğu çalıştırdıktan sonra, yeni bir konsol ekranında, sistem yöneticilerinin veritabanları üzerinde sorgu, crud ve diğer operasyonları gerçekleştirebilmesi adına tasarlanmış mongo JavaScript kabuğunu çalıştırmalıyız.
cs:~ cs$ mongo
Tam bu noktada, yeni başlayanlar için help komutu ile yardım almak, hangi komutla ne tür operasyonların gerçekleştirildiğini görmek faydalı olacaktır.
> help
 db.help()                    help on db methods
 db.mycoll.help()             help on collection methods
 sh.help()                    sharding helpers
 rs.help()                    replica set helpers
 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 db_name                  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

İlk olarak kurulumla birlikte gelen, varolan veritabanlarının listesine bakalım.
> show dbs
local   0.078125GB
Şimdi bir kullanım senaryosu belirleyelim ve ardından da, crud operasyonlarını gerçekleştireceğimiz collection’ları barındıracak veritabanımızı oluşturalım.
Senaryomuz
Kodcu.com’da yayınlanan makaleleri kategori, başlık, içerik, tarih, yazar, etiket alanlarına sahip dokümanlar(unutmayın, MongoDB’de her kayıt, aslında bir dokümandır) olarak saklamak, bu dokümanların alanları üzerinde sorgulama, güncelleme ve silme işlemlerini gerçekleştirmek.
> use kodcu
switched to db kodcu
MongoDB’de, alışageldiğimiz sql veritabanlarında var olana benzer, veritabanı oluşturmak için bir create komutu bulunmuyor. Böyle bir şeye gerek de yok, çünkü MongoDB create işlemini, tanımladığınız veritabanına kayıt eklediğiniz anda gerçekleştiriyor. Yukarıda yer alan use kodcu komutu ile biz, veritabanı tanımlama işlemini gerçekleştirmiş olduk. Çıktıdan anlaşılabileceği gibi, use komutu ile varolan veritabanları arasında seçim de yapabiliyoruz.
> article  = {
              category: ["Yazılar"], 
              title: "Lean Kanban Atölye Çalışması", 
              content: "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
              date: new Date('2013-04-11'), 
              author: "Altuğ Bilgin Altıntaş", 
              tags: [null]}
{
 "category" : ["Yazılar"],
 "title" : "Lean Kanban Atölye Çalışması",
 "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.",
 "date" : ISODate("2013-04-11T00:00:00Z"),
 "author" : "Altuğ Bilgin Altıntaş",
 "tags" : [null]
}
> db.articles.save(article)
db.articles.save(article) komutuyla, kodcu veritabanı içinde articles collection‘ını(önceki makalede belirtildiği gibi, MongoDB’de collection‘lar, sql dünyasında tablolara tekabül etmektedir) oluşturduk ve öncesinde tanımladığımız article objesini bu collection’a ekledik. Böylelikle MongoDB’ye ilk kaydımızı(doküman) eklemiş olduk.
Aşağıdaki komutla da aynı sonucu elde ederiz.
db.articles.insert({
                   category: [“Yazılar”], 
                   title: "Lean Kanban Atölye Çalışması", 
                   content: "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
                   date: new Date('2013-04-11'), 
                   author: "Altuğ Bilgin Altıntaş", 
                   tags: [null]})
> show dbs
kodcu 0.203125GB
local 0.078125GB
> show collections
articles
system.indexes
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "category" : [ "Yazılar" ], 
  "title" : "Lean Kanban Atölye Çalışması", 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "tags" : [ null ] 
}
Görüldüğü üzre, kodcu isminde veritabanımız, bu veritabanı içinde de articles isminde bir collection oluşmuş durumda. Collection üzerinde yapılan find() çağrısıyla da, ilgili collection’ın barındırdığı kayıtları çıktılamış olduk. Bu kayıtta bizim manuel girmediğimiz bir değer dikkatinizi çekmiş olmalı, id değeri.
MongoDB’de her bir dokümanın benzersiz/unique bir kimlik alanı vardır. Bu alan _id alanıdır. _id alanına manuel olarak değer atanmadığı takdirde, MongoDB bu alana ObjectId tipinde benzersiz bir kimlik değeri atamaktadır.
Oluşturduğumuz ilk kayıtta tags alanına null değer girdik, bu alanı güncelleyelim.
> db.articles.update({_id:ObjectId("516a93d0b26184f91a8b985c")}, 
                     {$set: {"tags": ["lean","kanban","eğitim"]}})
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
Şimdi yeni kayıtlar ekleyelim ve bu kayıtlar üzerinde sorgular çalıştırmayı görelim.
>db.articles.insert({
                    category: ["Yazılar"], 
                    title: "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
                    content: "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
                    date: new Date('2013-04-10'), 
                    author: "Kodcu.Com", 
                    tags: [null]})

>db.articles.insert({
                    category: ["Java", "Tutorial", "Yazılar", "Yazılım"], 
                    title: "Java ile Apache Solr’a Veri İndeksleme", 
                    content: "Merhabalar, bir önceki yazımda Apache Solr kurulumundan, konfigürasyonundan, komut satırından Solr’a veri indeksleme ve bu veriler üzerinden sorgu yapabilme işlemlerinden bahsetmiştim.", 
                    date: new Date('2013-04-09'), 
                    author: "Cüneyt Yeşilkaya", 
                    tags: ["java", "java ile solr'a veri indekslemek", "solr", "solrj"]})

>db.articles.insert({
                    category: ["NoSQL", "Yazılar"], 
                    title: "Çekirdek MongoDB İşlemleri", 
                    content: "NoSQL kavramı hakkında farkındalık oluşturup...", 
                    date: new Date('2013-04-15'), 
                    author: "Hüseyin Akdoğan", 
                    tags: ["mongodb", "nosql"]})
Şimdi, mevcut kayıtlar içinde, yazarı Altuğ Bilgin Altıntaş olan makaleleri arayalım.
> db.articles.find({author: "Altuğ Bilgin Altıntaş"})
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
Burada daha önce MongoDB’yi diğer NoSQL çözümlerden ayıran ve öne çıkaran hususlardan birisi olarak bahsettiğim, istenilen alana göre sorgulama yapabilme olanağını görmüş olduk. Yine aynı başlık altında belirttiğim gibi, MongoDB kullanıcılarına, sorgularda düzenli ifadelerden(regular expression) yararlanma olanağı da sunuyor. Bu bağlamda, içeriğinde Backbone ve JavaScript ifadeleri yer alan makaleleri bulmak istediğimizde şöyle bir söz dizimi kullanıyoruz.
> db.articles.find({content: {$regex: 'Backbone.*JavaScript'}})
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
MongoDB, düzenli ifadeleri kullanırken yararlanabileceğiniz oldukça yararlı 4 seçenek sunuyor. Bunlardan biri, büyük/küçük harf duyarsız sorgular için kullanılıyor.
> db.articles.find({content: {$regex: 'backbone.*javascript', $options: 'i'}})
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
Son olarak bir kaydı nasıl silebileceğimizi de görelim.
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
{ "_id" : ObjectId("516a943bb26184f91a8b985e"), 
  "category" : [ "Java", "Tutorial", "Yazılar", "Yazılım" ], 
  "title" : "Java ile Apache Solr’a Veri İndeksleme", 
  "content" : "Merhabalar, bir önceki yazımda Apache Solr kurulumundan, konfigürasyonundan, komut satırından Solr’a veri indeksleme ve bu veriler üzerinden sorgu yapabilme işlemlerinden bahsetmiştim.", 
  "date" : ISODate("2013-04-09T00:00:00Z"), 
  "author" : "Cüneyt Yeşilkaya", 
  "tags" : [ "java", "java ile solr'a veri indekslemek", "solr", "solrj" ] 
}
{ "_id" : ObjectId("516a9444b26184f91a8b985f"), 
  "category" : [ "NoSQL", "Yazılar" ], 
  "title" : "Çekirdek MongoDB İşlemleri", 
  "content" : "NoSQL kavramı hakkında farkındalık oluşturup...", 
  "date" : ISODate("2013-04-15T00:00:00Z"), 
  "author" : "Hüseyin Akdoğan", 
  "tags" : [ "mongodb", "nosql" ] 
}

Burada ele alıp, konsol uygulaması üzerinden gerçekleştirdiğimiz işlemleri, MongoDB’nin sürücü desteğinde bulunduğu yazılım dilleriyle gerçekleştirmek de mümkün. Nasip olursa bir sonraki makalede, MongoDB’nin sağladığı native java driver ile burada gördüğümüze benzer işlemlerin nasıl gerçekleştirilebileceğini ele alacağız. twitter/@yasinaktimur

Python json verileri liste haline çevirmek

Python'da json verileri json olarak kaydetip kaydedilen verileri liste halinde çekmek...

import json

array = '{"fruits": ["apple", "banana", "orange"]}'
data  = json.loads(array)
print data['fruits']
# {u'fruits': [u'apple', u'banana', u'orange']}

Python 'da json loads nedir ?

import json

job = ‘{“sender”: “omgbbqhax”,”message” : “justin timeber ++” }’



mad = json.loads(job)
print mad[‘sender’]

print mad[‘message’]

Python pickle nedir nasıl kullanılır .

import pickle
import redis

r = redis.StrictRedis(host='localhost', port=6379, db=0)
obj = ExampleObject()
pickled_object = pickle.dumps(obj)
r.set('some_key', pickled_object)
unpacked_object = pickle.loads(r.get('some_key'))
obj == unpacked_object

MongoDB database nasıl silinir ?

> use mydb; 
> db.dropDatabase();

Pymongo Kullanımı örnekleri

#öncelikle pymongoyu import ediyorum ve pymongo clienti çekiyorum.
#3. satırda yeni bir client oluşturdum.
#4. satırda database’e bağlandım database ‘e collection a bağlanmak için kullanacağız ayrıca bazı fonksiyonlarda db işimize yarıyacak.
#collection ile koleksiyonumuzu seçtik bu sql ‘deki tablo anlamına geliyor.
#find_one() ile rastgele sanırım ilk datamızı çekiyor array değişkenlerine bakmak için kullanılabilir tabii içi boş halde istersek içini doldurabiliyor ve özel sorgular yazabiliyoruz.
import pymongo
from pymongo import MongoClient
client = MongoClient()
db = client.chatsocial
collection = db.channels
collection.find_one()
collection.find_one({“channel”: “victimia”})
#yukarıda  channeli victimia olarak kayıtlı json ‘un tüm bilgilerini getiriyor.
data = collection.find_one({“channel”: “victimia”})
#istersek gelen jsonu yukarıdaki gibi bir değişkene atayarak işlem yapabiliyoruz.
Eğer kolleksiyonda değişiklik yapmak istersek :
collection.update({“channel”:”victimia”},{“$set”: {“selfs”: [“deneme”,”dene”]}}, upsert=False)
data = {“channel”:”yasinaktimur”, “selfs”: [“one”,”two”]}
mff = collection.insert(data)
#bu şekilde veri eklenebilir (aynı veri iki kez  eklenebilir.)
print mff derseniz eklenen objenin id değerini verir siz id değeri girmesenizde #mongoDB otomatik id atar.

Django with SockJS

Few days ago Peter Bengtsson wrote an interesting blog post on SockJS:
The article is oldukça kısa, let me try to provide step-by-step instructions on how to start your first Django on SockJS project.

Python servers

First, it’s important to understand that there are many HTTP (okay, WSGI) servers for Django. SockJS requires pretty deep integration with the web server, and you will need to use a particular web server with SockJS support.
Currently there are a number of SockJS libraries that work with variety of servers (with quality and completeness varying):
I’ll focus on SockJS-tornado here. This means that the usual Django deployment instructions will not be fully applicable to our project (as we’ll be using Tornado Web HTTP server).
In the mentioned article Peter suggested starting two HTTP servers separately - one for Tornado and one for Django. In this blog post I’ll put Django behind Tornado, so a single Tornado web server will handle all the requests.

Step 0: Python requirements

We will need few Python packages - Django, Tornado and SockJS-Tornado. Let’s install them into a virtualenv environment:
$ mkdir djangosockjs
$ cd djangosockjs
$ cat > requirements.txt << EOF
tornado==2.1.1
sockjs-tornado==0.0.4
django==1.4.1
EOF
$ virtualenv venv
$ ./venv/bin/pip install -r requirements.txt 

Step 1: New project

Let’s create a normal Django project and activate the virtual environment:
$ ./venv/bin/django-admin.py startproject project
$ . ./venv/bin/activate
(venv)$ cd project/project

Step 2: Serving a static file

The Django project will be only a placeholder serving a single static file, without any logic inside. We only want to prove the usage of SockJS with Django using the same codebase and HTTP server.
We will serve a static file - index.html. You need to update TEMPLATE_DIRS in settings.py file:
TEMPLATE_DIRS = (
    'project/templates'
)
Additionally you need to expose the file from urls.py:
from django.conf.urls import patterns, include, url
from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
    url(r'^$', direct_to_template, {'template': 'index.html'}),
)
Finally, we need to create the index.html file. For simplicity we’ll borrow a very simple code from SockJS-node examples.
(venv)$ mkdir templates
(venv)$ cd templates
(venv)$ wget https://raw.github.com/sockjs/sockjs-node/master/examples/echo/index.html
(venv)$ cd ..
(venv)$ cd ..

Step 3: Tornado code

Our SockJS code will accept any incoming realtime connections and will echo all the received data. Here’s the code for the project/echosockjs.py file:
import sockjs.tornado

class EchoSockjsConnection(sockjs.tornado.SockJSConnection):
    def on_open(self, request):
        print "sockjs: open"

    def on_message(self, data):
        print "data: %r" % (data,)
        self.send(data)

    def on_close(self):
        print "sockjs: close"

def EchoSockjsRouter(prefix):
    return sockjs.tornado.SockJSRouter(EchoSockjsConnection, prefix).urls

Step 4: Tornado server

The last file we need to write, is the Tornado web server wrapper. It will do two things:
  • it will expose our SockJS endpoint EchoSockjsConnection under /echo path
  • it will forward all other requests to normal Django app
The adapted snippet from bdarnell will look like:
#!/usr/bin/env python

from tornado.options import options, define
import django.core.handlers.wsgi
import tornado.httpserver, tornado.ioloop
import tornado.web, tornado.wsgi
import project.echosockjs

define('port', type=int, default=8000)

wsgi_app = tornado.wsgi.WSGIContainer(
               django.core.handlers.wsgi.WSGIHandler())

tornado_app = tornado.web.Application(
    project.echosockjs.EchoSockjsRouter('/echo') + [
        ('.*', tornado.web.FallbackHandler,
               dict(fallback=wsgi_app)),
    ])
server = tornado.httpserver.HTTPServer(tornado_app)
server.listen(options.port)
print "[*] Listening at 0.0.0.0:%i" % (options.port,)
tornado.ioloop.IOLoop.instance().start()
Put it into a tornado_main.py file.

Finito

And to start the server:
(venv)$ chmod +x tornado_main.py
(venv)$ DJANGO_SETTINGS_MODULE=project.settings ./tornado_main.py 
Finally, visit http://localhost:8000/ and see if the echo is indeed working!
The full project is available on github.
If you wish to use this setup on production, you will be able to get better performance by separating Tornado from Django. Django is blocking, Tornado is asynchronous, it makes sense to scale them separately.