Latest web development tutorials

MongoDB Carte Réduire

Carte-Reduce est un modèle de calcul, signifie simplement que le gros du travail (données) décomposition (MAP) pour effectuer, puis fusionner les résultats dans un résultat final (REDUIRE).

MongoDB fournit une carte-plus est très flexible pour l'analyse de données à grande échelle est également tout à fait pratique.


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 des fonctions de MapReduce pour atteindre les deux fonctions Carte et fonctions Réduire, Carte appel de fonction émet (clé, valeur), parcourir la collection dans tous les dossiers, et la valeur de clé est passé à la fonction Réduire pour le traitement.

fonction de la carte doit appeler émettre (clé, valeur) Renvoie paires.

Description Paramètre:

  • fonction de mappage (générer des séquences de touches que réduire les paramètres de lafonction): carte.
  • réduire les fonctions statistiques, la tâche est de réduire les valeurs-clés de fonction en une valeur-clé, qui est, le tableau de valeurs en une valeur de valeur unique..
  • des résultats statistiques stockées ensemble (ne pas préciser l'utilisation de la collecte temporaire automatiquement supprimé après un client est déconnecté).
  • une condition de filtrede requête, seulement pour répondre aux conditions du document sera appelée fonction de la carte.(Query.limit, tri peut mélanger)
  • tri et contraignant sort sort paramètre (également un ancien document envoyé à la fonction de la carte pour trier) limite, vous pouvez optimiser le mécanisme de regroupement
  • limiter le nombre de documents envoyés à la limite supérieure de la fonction de la carte (s'il n'y a pas de limite, en quelque sorte seul peu utile)

Utilisez MapReduce

Considérez la structure du document ci-dessous pour stocker des articles, des documents de l'utilisateur, et stocke le champ d'état de l'article utilisateur user_name:

>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "mark",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "w3big",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "w3big",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "本教程,最全的技术文档。",
   "user_name": "w3big",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })

Maintenant, nous allons utiliser les messages mis en fonction de MapReduce pour sélectionner un article publié (statut: «actif»), et par paquet de user_name calculé pour chaque utilisateur Messages:

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

Au-dessus de MapReduce sortie est:

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

Les résultats ont montré qu'un total de quatre correspondent aux critères de recherche (statut: "actifs") documents générés quatre clé dans la fonction de la carte dans le document, et ensuite utiliser la même fonction pour réduire la clé divisée en deux groupes.

Paramètres spécifiques:

  • Résultat: stocker les résultats du nom de la collection, c'est un ensemble temporaire en retrait de la connexion automatique de MapReduce a été supprimé.
  • timeMillis: exécution prend du temps, en millisecondes
  • entrée: le numéro de l'état du document est envoyé à la fonction de la carte
  • émettre: fois en fonction de la carte émettent est appelée, qui est, le montant total de toute la collection de données
  • ouput: Résultats Nombre de documents de la collection (comptage est très utile pour le débogage)
  • ok: le succès, la réussite 1
  • ERR: Si elle échoue, il peut y avoir une raison à l'échec, mais de l'expérience, la raison est vague, pas très utile

Utilisation de l'opérateur de trouver pour afficher les résultats de la requête MapReduce de:

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

Les résultats de la requête ci-dessus est présentée ci-dessous, il y a deux utilisateurs tom et marquer deux articles publiés:

{ "_id" : "mark", "value" : 4 }
{ "_id" : "w3big", "value" : 1 }

D'une manière similaire, MapReduce peut être utilisé pour construire de grandes requêtes globales, complexes.

fonctions de la fonction Carte et Réduire peuvent être mises en œuvre en utilisant JavaScript, MapReduce faire usage de très flexible et puissant.