sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB 2.6 Aggregation Framework Forbedringer

Dette er et gæsteindlæg af Vlad Mihalcea. Vlad er en softwarearkitekt, der brænder for softwareintegration, høj skalerbarhed og samtidighedsudfordringer. Her er et link til det originale indlæg.

MongoDB udvikler sig hurtigt. 2.2-versionen introducerede aggregeringsrammen som et alternativ til Map-Reduce forespørgselsmodellen. Generering af aggregerede rapporter er et tilbagevendende krav for virksomhedssystemer, og MongoDB skinner i denne henseende. Hvis du er ny til det, vil du måske tjekke denne aggregeringsramme-introduktion eller ydelsesjusteringen og datamodelleringsvejledningerne.

Lad os genbruge den datamodel, jeg først introducerede, mens vi demonstrerede de lynhurtige MongoDB-indsættelsesmuligheder:

{ "_id" :ObjectId("5298a5a03b3f4220588fe57c"), "created_on" :ISODate("2012-04-22T01:09:53Z"), "værdi" :0,16478511316706 

MongoDB 2.6 Aggregation-forbedringer

I version 2.4, hvis jeg kører følgende aggregeringsforespørgsel:

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

Jeg ramte begrænsningen på 16 MB aggregeringsresultat:

{ "errmsg" :"undtagelse:aggregeringsresultatet overstiger maksimal dokumentstørrelse (16MB)", "code" :16389, "ok" :0}

MongoDB-dokumenter er begrænset til 16 MB, og før 2.6-versionen var aggregeringsresultatet et BSON-dokument. 2.6-versionen erstattede den med en markør i stedet.

Kørsel af den samme forespørgsel på 2.6 giver følgende resultat:

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

Jeg brugte den markørbaserede objsLeftInBatch metode til at teste aggregeringsresultattypen, og begrænsningen på 16 MB gælder ikke længere for det samlede resultat. Markørens indre resultater er almindelige BSON-dokumenter, derfor er de stadig begrænset til 16 MB, men dette er langt mere overskueligt end den tidligere samlede resultatgrænse.

2.6-versionen adresserer også aggregeringshukommelsesbegrænsningerne. En komplet samlingsscanning, såsom:

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

kan ende med følgende fejl:

{ "errmsg" :"undtagelse:Overskredet hukommelsesgrænsen for $group, men tillod ikke ekstern sortering. Send allowDiskUse:true for at tilmelde dig.", "code" :16945, "ok" :0} 

Så vi kan nu udføre store sorteringsoperationer ved hjælp af parameteren allowDiskUse:

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

2.6-versionen giver os mulighed for at gemme aggregeringsresultatet til en anden samling ved hjælp af det nyligt tilføjede $out stadium.

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

Nye operatører er blevet tilføjet såsom let, map, cond, for at nævne nogle få.

Det næste eksempel vil tilføje AM eller PM til tidsoplysningerne for hver specifik begivenhedsindgang.

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:{ "clock" :{ $let:{ vars:{ "hour":{ $substr:["$created_on", 11, -1] }, "am_pm":{ $cond:{ if:{ $lt:[ {$hour :"$created_on" }, 12 ] }, derefter:'AM',else:'PM'} } }, i:{ $concat :[ "$$time", " ", "$$am_pm"] } } }},{ $limit:10}]);dataSet.forEach(function(document) { printjson(document);});

Resulterer i:

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

Konklusion

MongoDB 2.6-versionen kommer med en masse andre forbedringer såsom masseoperationer eller indekskryds. MongoDB udvikler sig konstant og tilbyder et levedygtigt alternativ til dokumentbaseret lagring. Med sådan en udviklingshastighed er det ikke underligt, at den blev kåret til årets database i 2013.


  1. Opdel en streng med et tegn i Lua

  2. Bulk upsert i MongoDB ved hjælp af mongoose

  3. Grundlæggende overvejelser for at tage en MongoDB-sikkerhedskopi

  4. Redis distribueret trin med låsning