Réduire la carte MongoDB
Map-Reduce est un modèle informatique, en termes simples, il décompose un grand lot de travail (données) pour l'exécution (MAP), puis fusionne les résultats dans le résultat final (REDUCE).
Le Map-Reduce fourni par MongoDB est très flexible et assez pratique pour l'analyse de données à grande échelle.
Commande MapReduce
Ce qui suit est la syntaxe de base de MapReduce :
>db.collection.mapReduce( function() {emit(key,value);}, //map 函数 function(key,values) {return reduceFunction}, //reduce 函数 { out: collection, query: document, sort: document, limit: number } )
Utilisation de MapReduce pour implémenter deux fonctions Fonction Map et la fonction Réduire, les appels de fonction Map émettent (clé, valeur), Parcourez tous les enregistrements de la collection et transmettez la clé et la valeur à la fonction Réduire pour traitement.
La fonction Map doit appeler submit(key, value) pour renvoyer la paire clé-valeur.
Description du paramètre :
map : fonction de mappage (génère une séquence de paires clé-valeur en tant que paramètre de fonction de réduction).
réduire Fonction statistique, la tâche de la fonction de réduction est de transformer les valeurs-clés en valeurs-clés, c'est-à-dire de transformer les valeurs tableau en une valeur unique. .
out La collection de stockage des résultats statistiques (si elle n'est pas spécifiée, une collection temporaire sera utilisée, qui sera automatiquement supprimée après la déconnexion du client).
requête Une condition de filtre Seuls les documents qui remplissent la condition appelleront la fonction de carte. (query.limit, sort peut être combiné à volonté)
sort Le paramètre sort sorting combiné avec limit (trie également les documents avant de les envoyer à la fonction map) , vous pouvez Optimiser le mécanisme de regroupement
limite La limite supérieure du nombre de documents envoyés à la fonction map (s'il n'y a pas de limite, utiliser le tri seul est peu utile)
Utiliser MapReduce
Considérez la structure de document suivante pour stocker les articles de l'utilisateur. Le document stocke le nom d'utilisateur de l'utilisateur et le champ d'état du. article :
>db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "php", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "php", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "php", "status":"active" }) WriteResult({ "nInserted" : 1 })
Maintenant, nous allons utiliser la fonction mapReduce dans la collection de publications pour sélectionner les articles publiés (statut : "actif"), les regrouper par nom d'utilisateur et calculer le nombre d'articles pour chaque utilisateur :
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
Le résultat de sortie mapReduce ci-dessus est :
{ "result" : "post_total", "timeMillis" : 23, "counts" : { "input" : 5, "emit" : 5, "reduce" : 1, "output" : 2 }, "ok" : 1 }
Les résultats montrent qu'il existe 4 documents qui répondent aux conditions de requête (statut : "actif"). Quatre documents de paires clé-valeur sont générés dans la fonction map, et enfin la fonction de réduction est utilisée pour diviser les mêmes valeurs clés en deux groupes.
Description du paramètre spécifique :
résultat : le nom de la collection qui stocke les résultats. Il s'agit d'une collection temporaire. la connexion MapReduce est fermée. Elle sera supprimée automatiquement.
timeMillis : le temps d'exécution, en millisecondes
saisie : le nombre de documents qui remplissent les conditions et qui sont envoyés au fonction map
emit : le nombre de fois que l'émission est appelée dans la fonction map, qui correspond à la quantité totale de données dans toutes les collections
ouput : le nombre de documents dans la collection de résultats Count (le nombre est très utile pour le débogage)
ok : que ce soit réussi, le succès est 1
-
erreur : S'il échoue, il peut y avoir une raison à l'échec, mais d'après l'expérience, la raison est vague et de peu d'utilité
Utilisez l'opérateur de recherche pour afficher les résultats de la requête mapReduce :
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
La requête ci-dessus affiche les résultats suivants. Deux utilisateurs, Tom et Mark, ont publié deux articles :
{ "_id" : "mark", "value" : 4 } { "_id" : "php", "value" : 1 }<. 🎜>De la même manière, MapReduce peut être utilisé pour créer des requêtes d'agrégation volumineuses et complexes. Les fonctions Map et Reduction peuvent être implémentées à l'aide de JavaScript, ce qui rend l'utilisation de MapReduce très flexible et puissante.