MongoDB document-oriented mimariye sahip NoSQL veritabanıdır.MongoDB üzerinde bildiğimiz klasik veritabanlarındaki gibi tablo yapısına sahip değil.Verilerimizi BSON (Binary JSON) şeklinde tutuyor.Tablo yapısı yok onun yerine collectionlar mevcut.
Öncelikle Map Reduce kavramı hakkında bilgi edinmek isterseniz devveri.com da Hakan İLTER‘in “Map Reduce Nedir” makalesini okumanız faydalı olur.
MongoDB üzerinde map reduce işlemlerini javascript ile yapılmaktadır.Klasik veritabanlarındaki count,sum,having gibi işlemleri yapmak için MongoDB üzerinde map reduce kullanıyoruz.
Örnek product collectionında bulunan verilerim aşağıdaki gibidir.
MongoDB üzerinde Map Reduce işlemlerini örneklerle anlatmak istiyorum.
Örnek 1 : Şimdi ürün tiplerine göre ürünlerin toplam fiyatını almak için örnek bir map reduce işlemi yapalım.
Shirt ürünlerimizin toplamı 50, Sweat Shirt ise 95.
Örnek 2 : Ürünlerin sizelarına göre toplam kaç adet ürün bulunmakta onun hesaplamak için map reduce örneği aşağıdaki gibidir.
Örnek 3 : Ürünlerin sizelarına göre bulunan ürünlerin toplam fiyatlarını hesaplamak için map reduce örneği aşağıdaki gibidir.
L üründen 11 adet ve bu ürünlerin toplam fiyatı 215 TL
XL üründen 19 adet ve bu ürünlerin toplam fiyatı 450 TL
XXL üründen 24 adet ve bu ürünlerin toplam fiyatı 580 TL
Örnek 4 : Ürün tiplerine göre bulunan product collectionındaki idlerini bulmak için map reduce örneği aşağıdaki gibidir.
Örnek 5: Hangi üründen hangi renklerden olduğunu bulabileceğeniz map reduce aşağıdaki gibidir.
Sonuç olarak bir çok işlemi map reduce kullanarak MongoDB üzerinde yapabilirsiz.Eğer yapılan işlemleri trace etmek isterseniz “print(”)” fonksiyonu ile yapabilirsiniz en nihayetinde bir javascript yazıyorsunuz.
Ellerine sağlık hocam çok güzel bir yazı olmuş…
Döküman için sağolun ama aklima birşey takıldı.MongoDB ve map reduce yeniyim.MongoDB de map reduce sadece count,sum,having gibi işlemler içinmi kullaniliyor,diğer işlemleri normal queryler ile halledilebilir mi?.Yoksa veriler çok büyük bir boyuta geldiktenten sonra hep map reduce’mu kullanmalıyız
Merhaba Ali,
Map-Reduce işlemini count,sum,having gibi queryleri MongoDB’de kullanmak için kullandığımız bir yöntem.Yoksa istersen sende programatik olarak bu işlemi yapabilirsin.Dataların büyümesi ile ilgili bir ihtiyaç değil map-reduce kullanımı.Sadece sana gerekli olan datayı en iyi yolda elde etmene yardımcı olan bir pattern.
Cevabinizi için teşekkür ederim, bu çok iyi oldu.Uzun zamandir kafami kurcaliyordu
Rica ederim.
Çok başarılı bir yazı olmuş. Tebrikler!!!
Merhaba. Veritabanı olarak mongodb kullanıyorum. Bazı kısımlarda map-reduce kullanıyorum ama performans olarak çok yavaş çalışıyor. 100.000 civarı document var. Real-time olarak sorgu yapıyorum. Yani bir sayfam var onu her çağırdağında bu map-reduce sorgusu çalışıyor. Nasıl kullanmam gerekir böyle işlemlerde? php ile kullanıyorum. Ama aynı fonksiyonları shell üzerinden denediğimde de yavaş çalışıyor.
Yardımcı olursanız sevirim.
Merhaba Alpay,
1-)MongoDB versiyonu nedir ve kaç bit?
2-)Map reduce işlemini yaptığın collectionda indexli alanların var mı kontrol edebilirsin.? ( Örnek : db.collectionName.getIndexKeys() )
3-)Eğer yok ise http://www.mongodb.org/display/DOCS/Indexes buradan kendine uygun olan index stratejisini uygulaman gereklidir.
4-)Mongo sunucusunda map-reduce çalışdığı zaman ki cpu ve ram değerleri neler oluyor onları gözlemleyebilirsin.
Ayrıca MongoDB üzerinde map-reduce halen single-threaded şekilde çalışıyor.Ama ileride javascript v8 geçerler ise ki geçmeyi planlıyor o zaman (https://jira.mongodb.org/browse/SERVER-4258) o zaman multi thread çalışıyor olucak.
mongodb 2.0.7 .
php ile kullanıyorum.
indexli alana ihtiyaç duymadım çünkü harhangi bir alanı sorgulamıyorum.Count işlemi yapıyorum sadece. Her document içinde bir tane dizi var, bu dizinin elaman sayısını ve id’sinin geri dönmesini istiyorum.Sadece _id alanı indexli. Kod şu şekilde.
$map = new MongoCode(“function() {
emit(this._id,{
‘_id’:this._id,’cd’:this.cd,’msgCount’:this.cs[0].msgs.length}
);
}”);
$reduce = new MongoCode(“function(k, vals) {
return vals[0];
}”);
if (isset($sessionId))
$query=Array(‘_id’=>new MongoId($sessionId));
$cmmd = smongo::$db->command(array(
“mapreduce” => “sessions”,
“map” => $map,
“reduce” => $reduce,
“out” => “result”));
Sonuç olarak bu dönüyor. Oldukça yavaş.
Array
(
[result] => result
[timeMillis] => 29452
[counts] => Array
(
[input] => 106026
[emit] => 106026
[reduce] => 0
[output] => 106026
)
[ok] => 1
)
Merhaba istediğin map-reduce aşağıdaki gibi.Bir dener misin?
map = function(){
emit(this._id,{'id':this._id,'msgCount':this.cs[0].msgs.length});
}
reduce = function reduce(key,values){
var result = { id: values[0], msgCount: values[1] };
return result;
}
Merhaba denedim. Yine çok yavaş.
Array
(
[result] => result
[timeMillis] => 11427
[counts] => Array
(
[input] => 106027
[emit] => 106027
[reduce] => 0
[output] => 106027
)
[ok] => 1
)
Merhaba,
Datalarını ve datalarının büyüklüğünü bilmiyorum tam olarak.Ama son kullanıcıya çıkan her sayfaya istek yapıldığında kritersiz bir şekilde mapreduce yapman bu arada düşündürücü.Her istek de map reduce işlemi yapmanı gerektirecek olan durumu değiştirmen gerekli bence.