sql >> Databáze >  >> NoSQL >> MongoDB

Vylepšení agregačního rámce MongoDB 2.6

Toto je příspěvek od Vlada Mihalcea. Vlad je softwarový architekt s nadšením pro softwarovou integraci, vysokou škálovatelnost a souběžné výzvy. Zde je odkaz na původní příspěvek.

MongoDB se rychle vyvíjí. Verze 2.2 zavedla rámec agregace jako alternativu k modelu dotazu Map-Reduce. Generování agregovaných zpráv je opakovaným požadavkem pro podnikové systémy a MongoDB v tomto ohledu září. Pokud jste v této oblasti nováčkem, možná byste si měli přečíst tento úvod agregačního rámce nebo vyladění výkonu a příručky pro datové modelování.

Pojďme znovu použít datový model, který jsem poprvé představil, při demonstraci bleskově rychlých možností vkládání MongoDB:

{ "_id" :ObjectId("5298a5a03b3f4220588fe57c"), "created_on" :ISODate("2012-04-22T01:09:53Z"), "value" :0,164785111167}

Vylepšení agregace MongoDB 2.6

Pokud ve verzi 2.4 spustím následující agregační dotaz:

db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :new Date(Date.UTC(2012, 0, 1)), $lte :new Date(Date.UTC(2012, 0, 10)) } }},{ $group:{ _id :{ "minuta" :{ $minuta :"$created_on" } }, "values":{ $addToSet:"$value" } }}]); 

Dosáhl jsem limitu 16MB pro výsledek agregace:

{ "errmsg" :"výjimka:výsledek agregace překračuje maximální velikost dokumentu (16 MB)", "code" :16389, "ok" :0}

Dokumenty MongoDB jsou omezeny na 16 MB a před verzí 2.6 byl výsledkem agregace dokument BSON. Verze 2.6 jej nahradila kurzorem.

Spuštění stejného dotazu na verzi 2.6 vede k následujícímu výsledku:

db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :new Date(Date.UTC(2012, 0, 1)), $lte :new Date(Date.UTC(2012, 0, 10)) } }},{ $skupina:{ _id :{ "minuta" :{ $minuta :"$created_on" } }, "values":{ $addToSet:"$value" } }}]). objsLeftInBatch();14

K otestování typu výsledku agregace jsem použil metodu objsLeftInBatch založenou na kurzoru a omezení 16 MB již na celkový výsledek neplatí. Vnitřní výsledky kurzoru jsou běžné dokumenty BSON, proto jsou stále omezeny na 16 MB, ale toto je mnohem lépe spravovatelné než předchozí celkový limit výsledků.

Verze 2.6 také řeší omezení agregační paměti. Kompletní skenování sbírky, například:

db.randomData.aggregate( [{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }}]) .objsLeftInBatch();

může skončit s následující chybou:

{ "errmsg" :"výjimka:Překročen limit paměti pro $group, ale nepovolil externí řazení. Předejte allowDiskUse:true pro přihlášení.", "code" :16945, "ok" :0} 

Nyní tedy můžeme provádět velké operace řazení pomocí parametru allowDiskUse:

db.randomData.aggregate( [{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }}], { allowDiskUse :true}).objsLeftInBatch();

Verze 2.6 nám umožňuje uložit výsledek agregace do jiné sbírky pomocí nově přidané fáze $out.

db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :new Date(Date.UTC(2012, 0, 1)), $lte :new Date(Date.UTC(2012, 0, 10)) } }},{ $group:{ _id :{ "minuta" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }},{ $ out :"randomAggregates"}]);db.randomAggregates.count();60

Byly přidány nové operátory, jako je let, map, cond, abychom jmenovali alespoň některé.

Následující příklad připojí AM nebo PM k časovým informacím každé konkrétní položky události.

var dataSet =db.randomData.aggregate( [{ $match:{ "created_on" :{ $gte :new Date(Date.UTC(2012, 0, 1)), $lte :new Date(Date.UTC (2012, 0, 2)) } }},{ $project:{ "hodiny" :{ $let:{ vars:{ "hodina":{ $substr:["$created_on", 11, -1] }, "am_pm":{ $cond:{ if:{ $lt:[ {$hour :"$created_on" }, 12 ] } , pak:'AM',else:'PM'} } }, v:{ $concat :[ "$$hour", " ", "$$am_pm"] } } } }},{ $limit :10}]);dataSet.forEach(function(document) { printjson(document);}); 

Výsledkem je:

"clock" :"16:07:14 PM""clock" :"22:14:42 PM""clock" :"21:46:12 PM""clock" :"03:35:00 AM ""hodiny" :"04:14:20""hodiny" :"03:41:39""hodiny" :"17:08:35""hodiny" :"18:44:02"" hodiny" :"19:36:07""hodiny" :"07:37:55"

Závěr

Verze MongoDB 2.6 přichází se spoustou dalších vylepšení, jako jsou hromadné operace nebo průnik indexů. MongoDB se neustále vyvíjí a nabízí životaschopnou alternativu pro ukládání dokumentů. Při takovém tempu vývoje není divu, že byla vyhlášena databází roku 2013.


  1. Mongo DB najde všechny záznamy s nejvyšší hodnotou v závislosti na klíčovém poli

  2. MongoDB $ne Operátor agregačního potrubí

  3. Mapovat/redukovat MongoDB ve více kolekcích?

  4. Jak zkontroluji, zda redis běží, než spustím baňku (a spustím ji, pokud ne)?