MongoDB utvecklas snabbt. 2.2-versionen introducerade aggregeringsramverket som ett alternativ till Frågemodellen Map-Reduce. Att generera aggregerade rapporter är ett återkommande krav för företagssystem och MongoDB lyser i detta avseende. Om du är ny på det kanske du vill kolla in den här introduktionen av aggregeringsramverket eller prestandajusteringen och datamodelleringsguiderna.
Låt oss återanvända datamodellen som jag först introducerade samtidigt som vi demonstrerade de blixtrande snabba MongoDB-insättningsfunktionerna:
{ "_id" :ObjectId("5298a5a03b3f4220588fe57c"), "created_on" :ISODate("2012-04-22T01:09:53Z"), "value" :0,164785181316706MongoDB 2.6 Aggregationsförbättringar
I version 2.4, om jag kör följande aggregeringsfråga:
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" } }]);Jag träffade begränsningen på 16 MB aggregeringsresultat:
{ "errmsg" :"undantag:aggregeringsresultatet överskrider maximal dokumentstorlek (16MB)", "code" :16389, "ok" :0}MongoDB-dokument är begränsade till 16 MB, och före 2.6-versionen var aggregeringsresultatet ett BSON-dokument. 2.6-versionen ersatte den med en markör istället.
Att köra samma fråga på 2.6 ger följande 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();14Jag använde den markörbaserade objsLeftInBatch metoden för att testa aggregationsresultattypen och begränsningen på 16 MB gäller inte längre för det totala resultatet. Markörens inre resultat är vanliga BSON-dokument, därför är de fortfarande begränsade till 16 MB, men detta är mycket mer hanterbart än den tidigare totala resultatgränsen.
Version 2.6 tar även upp begränsningarna för aggregeringsminnet. En fullständig samlingsskanning som:
db.randomData.aggregate( [{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }]) .objsLeftInBatch();kan sluta med följande fel:
{ "errmsg" :"undantag:har överskridit minnesgränsen för $group, men tillät inte extern sortering. Godkänn allowDiskUse:true för att opt in.", "code" :16945, "ok" :0}Så vi kan nu utföra stor sorteringsoperationer med hjälp av parametern allowDiskUse:
db.randomData.aggregate( [{ $group:{ _id :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet:"$value" } }], { allowDiskUse :true}).objsLeftInBatch();2.6-versionen låter oss spara aggregeringsresultatet till en annan samling med det nyligen tillagda $out stadiet.
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();60Nya operatörer har lagts till som let, map, cond, för att nämna några.
Nästa exempel kommer att lägga till AM eller PM till tidsinformationen för varje specifik händelsepost.
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 ] } , sedan:'AM',else:'PM'} } }, i:{ $concat :[ "$$hour", " ", "$$am_pm"] } } }},{ $limit:10}]);dataSet.forEach(function(document) { printjson(document);});Resulterar i:
"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"Slutsats
MongoDB 2.6-versionen kommer med många andra förbättringar som bulkoperationer eller index-skärning. MongoDB utvecklas ständigt och erbjuder ett hållbart alternativ för dokumentbaserad lagring. Med en sådan utvecklingstakt är det inte konstigt att den utsågs till årets databas 2013.