Този път нямахме занятия в компютърните зали, а поговорихме малко на тема MongoDB, виден представител на документните NoSQL бази. Акцентът беше върху tooling темата. Показахме как изглеждат документите на тази база, споменахме и за двоичния BSON формат, в който реално се съхраняват те. Създадохме няколко документа през shell-a (който е на практика една JavaScript конзола), записахме ги в базата, някои ги update-нахме.

Видяхме, че всичко тук е JavaScript/JSON документи, като за да изразите някакво условие при търсене например, отново ползвате документен синтаксис (че дори и exception-ът, който получихме в Eclipse, имаше message, форматиран като документ). За целта полезни са т.нар. модификатори - ключове, които се интерпретират от Mongo по специален начин, и ви дават на практика език, за изразяване на действия с документи.

За онези условия, които не могат да се изразят в термините на вградените модификатори, има специален модификатор - $where, който ви позволява да използвате произволна JavaScript функция за обработка (вътре в нея получавате this като референция към документа).

Показахме основни действия с Mongo база през един интересен GUI tool - MongoVUE - доста по-приятен за работа от shell-а, като същевременно в "Learn Shell" ви показва реалната команда, която се изпълнява към базата.

Върхът на айсберга беше MapReduce обработка на документи, която в случая на MongoDB се изразява в комбинация от map, reduce и finalize фази - описвате ги отново като JavaScript функции. Пуснахме един MapReduce пример, който трябваше да определи за всяка държава коя е двойката градове с минимално разстояние между тях (или да произведе съответно съобщение - пак документ - ако в държавата има само един град).

Ето една интересна съпоставка между SQL и query възможностите на Mongo. Ето и интересна графика, която показва къде стои Mongo във functionality/scalability&performance координатната система.

Забележка: Ако искате да се поупражнявате точно с този пример, при който базата се импортва от MySQL база - инструкциите от горния линк са доста неточни. Пишете ми за да не се мъчите, аз доста си играх докато го подкарам.

Накрая, в Eclipse създадохме един прост Java проект, през който извикахме същия MapReduce task в Mongo, ползвайки Java driver-а. Погледнахме набързо API-то му, и не останахме особено очаровани от факта, че map, reduce, finalize функциите се изразяват чрез java.lang.String. Работата с документи, а значи и с MongoDB, е далеч по-интуитивна при езици като Ruby, Python, JavaScript, защото те предлагат езикови конструкции, които са много близки до JSON структурата - речници, хешове. В случая на Java нещата са малко по-"дървени". Като цяло, Eclipse интеграцията е слаба, и има какво да се подобри в dev experience-а. Има създаден plug-in, така че ако имате интерес, може първо с тоя човечец да поговорите, преди да почвате нещо from scratch.

Поздрави и приятно посрещане на Великденските празници :),
Крум.

Last modified: Saturday, 12 November 2011, 5:38 PM