mongoDB map-reduce funksiyası
Hansı verilənlər bazası sistemi ilə işləyirsiniz,işləyin sizdən analitik sorğular yazmağınız istəniləcəkdir.Çünki,verilənlər bazasını istifadə etmə səbəblərindən biri də verilənləri analiz edə bilməkdir.MSSQL Server,Oracle,MySQL kimi əlaqəli verilənlər bazası sistemlərində işləyən oxuyucularımıza SQL sorğu dilində istifadə olunan group by komandası tanışdır.Bir nümunə əsasında aggregation(qruplaşdırma) nədir onun izahını verməyə çalışaq.
Tutaq ki,kurs 20 şagird arasında ümumi mənimsənilmə səviyyəsini bilmək üçün imtahan keçirir.İmtahandan keçmə şərti isə bütün fənnlərdən ən az 15 düzgün cavab yazmaqdır.Bunun üçün müəllim nə etməlidir?şagirdlərin cavablarına baxır,riyaziyyat fənnindən 15+ düzgün cavab yazan şagirdləri sayıb,bir kağıza dərsin adını və o dərsdən uğurla keçən şagird sayını yazır.Sonra ingilis dili fənnindən 15+ düzgün cavab yazan şagird sayını yazaraq ayırır.Eyni qayda ilə 5 fənndən uğurla keçən şagird sayını müəyyən edir.
Müəllim burada qruplaşdırmadan istifadə edir,qruplaşdırma kriteriyası isə fənn adlarıdır.(yəni group by fənn adı)
MongoDB-da qruplaşdırmadan iki üsulla istifadə etmək olar.
1)aggregation pipeline
2)map-reduce funksiyası
Bugün map-reduce haqqında danışacağıq.Mongo Shellin Javascript dəstəyi sayəsində aggregate işlərini Javascript komandalarını və funksiyalarını istifadə edərək yerinə yetirə bilərik.Əgər javascript bilikləriniz varsa,bu üsul sizin üçündür deyə bilərik ?.
Map-reduce funksiyasını başa düşmək üçün işin məntiqini öyrənmək lazımdır.map-reduce işləmə prinsipini açıqlamağa çalışaq.
Bu prinsipə görə,hər bir aggregation(qruplaşdırma) əməliyyatı mütləq bir qruplaşdırma kriteriyasına,yəni acara ehtiyac duyur.Burada map funksiyası açarı tanıtmaq üçündür,reduce isə map ilə göndərilən açar üzərindən,bizim qruplaşdırma əməliyyatımızın baş verdiyi funskiyadır.Daha sadə desək,biz map üzərindən kriteriya(yəni qruplaşdırmanı nəyə görə edəcəyik) göstəririk,reduce-də bizim kriteriyamıza uyğun qruplaşdırma əməliyyatı gerçəkləşdirilir.
Bir nümunə üzərindən izah etməyə çalışaq.
“mekteb” adlı databasemizdə “sinif” adlı yeni collection yaradaq.
Yuxarıdakı verilənləri “sagird_ad” fieldinə görə qruplaşdırıb,ortalama “ugur_faizi” qiymətini çıxardaq.
Bunun üçün ilk olaraq,map funksiyamızı yazırıq ki,reduce bilsinki bizim qruplaşdırma kriteriyamız(açarımız) nə olacaq və hansı dəyərlər üzərində iş görəcək.map funksiyamızı aşağıdakı kodlarla yazırıq
Burada emit funksiyası üçün ayrıca mötərizə açmaq daha yaxşıdır.emit funksiyasının map function-dakı vəzifəsi isə,reduce funksiyasına lazimi dəyərləri ötürməkdir.(emit dilimizə yaymaq,ötürmək buraxmaq kimi tərcümə olunur)
İndi isə gələk reduce funksiyasına
Bu funksiyada gördüyünüz kimi iki parametr var.Bunlardan birincisi,qruplaşdırma kriteriyası (açar) olaraq map funksiyasından göndərilən “sagird_ad”,ikincisi isə açara görə qruplaşdırılacaq olan “ugur_faizi” parametridir.
Aha,ayrı-ayrılıqda map və reduce funksiyasını yaratdıq,bəs bunları necə işlədək?
Bunun üçün MongoDB bizlərə mapReduce adında bir funksiya təqdim edir.Bu funksiyanın parametrlərinə,yaratmış olduğumuz map və reduce funksiyalarının adını yazırıq.
Bu nəticə o deməkdir ki,qruplaşdırma uğurla başa çatdı )) Onu da qeyd edim ki,mapReduce funksiyası çalışdığında nəticə out parametri altında göstərildiyi adda collection yaradıb,onun içinə dolur.Bunu unutmayın!Yəni əgər bizim databasemizdə öncədən “sagirdin_ortalama_ugur_faizi” adında bir collection olsaydı mapReduce funksiyası işləməyəcəkdi.
Nəticəyə baxmaq üçün,”sagirdin_ortalama_ugur_faizi” collectionunu sorğulayaq
Və budur,hərşey hazır! sonda bir şeyi qeyd edim əgər qruplaşdırma nəticəsini yeni bir collectionda deyildə,sorğu kimi çıxartmaq istəyirsinizsə, db.sinif.mapReduce(mapFunc,reduceFunc,{out:{inline:1}}) sorğusunu yaza bilərsiz.
map-reduce dən danışacaqlarımız bu qədər.Başa düşdünüz deyə düşünürəm.Növbəti blog yazımızda aggregation pipeline dən bəhs edəcəyik.Nəyisə başa düşmədinizsə,və ya sualınız varsa Contact bölümündə qeyd olunmuş elektron ünvanla əlaqə saxlayın.
Hamınıza uğurlar