MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Améliorations du cadre d'agrégation de MongoDB 2.6

Ceci est un article invité de Vlad Mihalcea. Vlad est un architecte logiciel passionné par l'intégration logicielle, la haute évolutivité et les défis de la concurrence. Voici un lien vers le message d'origine.

MongoDB évolue rapidement. La version 2.2 a introduit le framework d'agrégation comme alternative au modèle de requête Map-Reduce. La génération de rapports agrégés est une exigence récurrente pour les systèmes d'entreprise et MongoDB brille à cet égard. Si vous débutez, vous voudrez peut-être consulter cette introduction sur le cadre d'agrégation ou les guides de réglage des performances et de modélisation des données.

Réutilisons le modèle de données que j'ai présenté pour la première fois tout en démontrant les capacités d'insertion rapides de MongoDB :

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

Améliorations de l'agrégation de MongoDB 2.6

Dans la version 2.4, si je lance la requête d'agrégation suivante :

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" } }}]); 

J'ai atteint la limite de résultat d'agrégation de 16 Mo :

{ "errmsg" :"exception :le résultat de l'agrégation dépasse la taille maximale du document (16 Mo)", "code" :16389, "ok" :0}

Les documents MongoDB sont limités à 16 Mo, et avant la version 2.6, le résultat de l'agrégation était un document BSON. La version 2.6 l'a remplacé par un curseur à la place.

L'exécution de la même requête sur 2.6 donne le résultat suivant :

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

J'ai utilisé la méthode objsLeftInBatch basée sur le curseur pour tester le type de résultat d'agrégation et la limite de 16 Mo ne s'applique plus au résultat global. Les résultats internes du curseur sont des documents BSON normaux, ils sont donc toujours limités à 16 Mo, mais c'est beaucoup plus gérable que la limite de résultat globale précédente.

La version 2.6 résout également les restrictions de mémoire d'agrégation. Une analyse complète de la collection telle que :

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

peut se retrouver avec l'erreur suivante :

{ "errmsg" :"exception :limite de mémoire dépassée pour $group, mais le tri externe n'a pas été autorisé. Passez allowDiskUse:true pour l'activer.", "code" :16945, "ok" :0} 

Ainsi, nous pouvons désormais effectuer des opérations de tri volumineuses à l'aide du paramètre allowDiskUse :

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

La version 2.6 nous permet d'enregistrer le résultat de l'agrégation dans une autre collection à l'aide de la nouvelle étape $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 :{ "minute" :{ $minute :"$created_on" } }, "values":{ $addToSet :"$value" } }},{ $ sortie :"randomAggregates"}]);db.randomAggregates.count();60

De nouveaux opérateurs ont été ajoutés tels que let, map, cond, pour n'en nommer que quelques-uns.

L'exemple suivant ajoutera AM ou PM aux informations d'heure de chaque entrée d'événement spécifique.

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 ] } , then:'AM',else:'PM'} } }, in:{ $concat :[ "$$hour", " ", "$$am_pm"] } } } }},{ $limit :10}]);dataSet.forEach(function(document) { printjson(document);}); 

Résultant en :

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

Conclusion

La version 2.6 de MongoDB est livrée avec de nombreuses autres améliorations telles que les opérations en masse ou l'intersection d'index. MongoDB évolue constamment, offrant une alternative viable au stockage basé sur des documents. À un tel rythme de développement, il n'est pas étonnant qu'elle ait été nommée base de données de l'année 2013.