MongoDB - Réduire la carte

Selon la documentation MongoDB, Map-reduceest un paradigme de traitement des données pour condenser de grands volumes de données en résultats agrégés utiles. Utilisations de MongoDBmapReducecommande pour les opérations de réduction de carte. MapReduce est généralement utilisé pour traiter de grands ensembles de données.

Commande MapReduce

Voici la syntaxe de la commande de base mapReduce -

>db.collection.mapReduce(
   function() {emit(key,value);},  //map function
   function(key,values) {return reduceFunction}, {   //reduce function
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

La fonction de réduction de mappage interroge d'abord la collection, puis mappe les documents de résultat pour émettre des paires clé-valeur, qui sont ensuite réduites en fonction des clés qui ont plusieurs valeurs.

Dans la syntaxe ci-dessus -

  • map est une fonction javascript qui mappe une valeur avec une clé et émet une paire clé-valeur

  • reduce est une fonction javascript qui réduit ou regroupe tous les documents ayant la même clé

  • out spécifie l'emplacement du résultat de la requête de réduction de carte

  • query spécifie les critères de sélection facultatifs pour la sélection des documents

  • sort spécifie les critères de tri facultatifs

  • limit spécifie le nombre maximum facultatif de documents à renvoyer

Utilisation de MapReduce

Considérez la structure de document suivante stockant les publications des utilisateurs. Le document stocke le nom_utilisateur de l'utilisateur et le statut de la publication.

{
   "post_text": "tutorialspoint is an awesome website for tutorials",
   "user_name": "mark",
   "status":"active"
}

Maintenant, nous allons utiliser une fonction mapReduce sur notre posts collection pour sélectionner toutes les publications actives, regroupez-les sur la base de nom_utilisateur puis comptez le nombre de publications de chaque utilisateur en utilisant le code suivant -

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
	
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
)

La requête mapReduce ci-dessus génère le résultat suivant -

{
   "result" : "post_total",
   "timeMillis" : 9,
   "counts" : {
      "input" : 4,
      "emit" : 4,
      "reduce" : 2,
      "output" : 2
   },
   "ok" : 1,
}

Le résultat montre qu'un total de 4 documents correspondait à la requête (statut: "actif"), la fonction map a émis 4 documents avec des paires clé-valeur et enfin la fonction de réduction regroupait les documents mappés ayant les mêmes clés en 2.

Pour voir le résultat de cette requête mapReduce, utilisez l'opérateur find -

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
	
).find()

La requête ci-dessus donne le résultat suivant qui indique que les deux utilisateurs tom et mark avoir deux messages dans des états actifs -

{ "_id" : "tom", "value" : 2 }
{ "_id" : "mark", "value" : 2 }

De la même manière, les requêtes MapReduce peuvent être utilisées pour construire de grandes requêtes d'agrégation complexes. L'utilisation de fonctions Javascript personnalisées utilise MapReduce qui est très flexible et puissant.