sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB 2.6 Aggregation Framework Förbättringar

Detta är ett gästinlägg av Vlad Mihalcea. Vlad är en mjukvaruarkitekt som brinner för mjukvaruintegration, hög skalbarhet och samtidighetsutmaningar. Här är en länk till det ursprungliga inlägget.

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,164785181316706 

MongoDB 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();14

Jag 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();60

Nya 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.


  1. Mongo kan inte starta

  2. Vilka är användningsfallen där Redis föredras framför Aerospike?

  3. Lyssna efter ändringar i redis-listan

  4. Mongoose - Spara en rad strängar