MongoDB се развива бързо. Версията 2.2 въведе рамката за агрегиране като алтернатива на модела на заявка Map-Reduce. Генерирането на обобщени отчети е периодично изискване за корпоративните системи и MongoDB блести в това отношение. Ако сте нов, може да искате да проверите това въведение в тази рамка за агрегиране или настройката на производителността и ръководствата за моделиране на данни.
Нека използваме повторно модела на данни, който представих за първи път, докато демонстрираме невероятно бързите възможности за вмъкване на MongoDB:
{ "_id" :ObjectId("5298a5a03b3f4220588fe57c"), "created_on" :ISODate("2012-04-22T01:09:53Z"), "value" :0,164785183160}
MongoDB 2.6 Подобрения в агрегирането
Във версия 2.4, ако изпълня следната заявка за агрегиране:
db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :нова дата(Date.UTC(2012, 0, 1)), $lte :нова дата(Date.UTC(2012, 0, 10)) } }},{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }}]);
Постигнах ограничението за резултат от агрегиране от 16MB:
{ "errmsg" :"изключение:резултатът от агрегирането надвишава максималния размер на документа (16MB)", "код" :16389, "ok" :0}
Документите на MongoDB са ограничени до 16MB, а преди версията 2.6 резултатът от агрегирането беше BSON документ. Версията 2.6 я вместо това го заменя с курсор.
Изпълнението на същата заявка на 2.6 дава следния резултат:
db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :нова дата(Date.UTC(2012, 0, 1)), $lte :нова дата(Date.UTC(2012, 0, 10)) } }},{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }}]). objsLeftInBatch();14
Използвах метода objsLeftInBatch, базиран на курсора, за да тествам типа резултат на агрегиране и ограничението от 16 MB вече не се прилага за общия резултат. Вътрешните резултати на курсора са обикновени BSON документи, следователно те все още са ограничени до 16MB, но това е много по-управляемо от предишното общо ограничение за резултати.
Версията 2.6 също разглежда ограниченията на паметта за агрегиране. Пълно сканиране на колекция като:
db.randomData.aggregate( [{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }}]) .objsLeftInBatch();
може да завърши със следната грешка:
{ "errmsg" :"изключение:Превишено е ограничението на паметта за $group, но не е разрешено външно сортиране. Предайте allowDiskUse:true, за да се включите.", "code" :16945, "ok" :0}предварително>Така че вече можем да извършваме големи операции по сортиране с помощта на параметъра allowDiskUse:
db.randomData.aggregate( [{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }}], { allowDiskUse :true}).objsLeftInBatch();Версията 2.6 ни позволява да запазим резултата от агрегирането в друга колекция, използвайки новодобавения етап $out .
db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :нова дата(Date.UTC(2012, 0, 1)), $lte :нова дата(Date.UTC(2012, 0, 10)) } }},{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }},{ $ out :"randomAggregates"}]);db.randomAggregates.count();60Добавени са нови оператори като let, map, cond, за да назовем само няколко.
Следващият пример ще добави AM или PM към информацията за времето на всеки запис на конкретно събитие.
var dataSet =db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :нова дата(Date.UTC(2012, 0, 1)), $lte :нова дата(Date.UTC (2012, 0, 2)) } }},{ $project:{ "clock" :{ $let:{ vars:{ "hour":{ $substr:["$created_on", 11, -1] }, "am_pm":{ $cond:{ if:{ $lt:[ {$hour :"$created_on" }, 12 ] }, след това:'AM', else:'PM'} } }, в:{ $concat :[ "$$hour", " ", "$$am_pm"] } } } }},{ $limit :10}]);dataSet.forEach(function(document) { printjson(document);});предварително>В резултат на:
"clock" :"16:07:14 PM""clock" :"22:14:42 PM""clock" :"21:46:12 PM""clock" :"03:35:00 AM ""clock" :"04:14:20 AM""clock" :"03:41:39 AM""clock" :"17:08:35 PM""clock" :"18:44:02 PM"" clock" :"19:36:07 PM""clock" :"07:37:55 AM"Заключение
Версията на MongoDB 2.6 се предлага с много други подобрения като групови операции или индексно пресичане. MongoDB непрекъснато се развива, предлагайки жизнеспособна алтернатива за базирано на документи съхранение. При такъв темп на развитие не е чудно, че е обявена за база данни на годината за 2013 г.