English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB mapReduce-Befehl

Laut MongoDB-Dokumentation ist Map Reduce ein Datenverarbeitungsparadigma, das verwendet wird, um große Datenmengen in nützliche Aggregateresultate zu komprimieren. MongoDB verwendet den Befehl mapReduce für MapReduce-Operationen. MapReduce wird in der Regel zur Verarbeitung großer Datensätze verwendet.

MapReduce-Befehl

Hier ist die Syntax des grundlegenden mapReduce-Befehls-

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

map-Die reduce-Funktion führt zunächst eine Abfrage auf die Sammlung durch und mappt die Ergebnisse, um Schlüssel zu emittieren-Wertpaare und reduziert sie dann basierend auf Schlüsseln mit mehreren Werten.

In der obigen Syntax-

  • map ist eine JavaScript-Funktion, die einen Schlüssel in einen Wert mappt und einen Schlüssel emittiert-Wertpaare

  • reduce ist eine JavaScript-Funktion, die alle Dokumente mit gleicher Schlüssel zu reduzieren oder zu gruppieren

  • out Bestimmen Sie map-Position der mapReduce-Abfrageergebnisse

  • query Bestimmen Sie die optionale Auswahlkriterien für die Dokumente

  • sort Bestimmen Sie die optionale Sortierbedingung

  • limit Bestimmen Sie die optionale maximale Anzahl der zurückgegebenen Dokumente

Verwenden Sie MapReduce

Bedenken Sie die folgende Dokumentstruktur für die Speicherung von Benutzerbeiträgen. Das Dokument speichert den user_name und den Veröffentlichungsstatus des Benutzers.

{
   "post_text": "w3codebox ist eine großartige Website für Tutorials
   "user_name": "mark",
   "status":"aktiv"
}

Jetzt werden wirpostsVerwenden Sie die mapReduce-Funktion auf der Sammlung, um alle aktiven Beiträge auszuwählen, sie nach user_name zu gruppieren und die folgenden Codezeilen, um die Anzahl der Beiträge jedes Benutzers zu zählen-

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

Die obige mapReduce-Abfrage gibt folgende Ergebnisse aus-

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

Die Ergebnisse zeigen, dass es insgesamt4Dokumente, die mit der Abfrage übereinstimmen (status:"aktiv"), die map-Funktion sendet4Ein Dokument mit Schlüssel-Wert-Paaren, das durch die reduce-Funktion in Dokumente mit gleichen Schlüsseln unterteilt wird, die die gleiche Schlüsselzuordnung haben2Stück.}

Um das Ergebnis dieser mapReduce-Abfrage anzuzeigen, verwenden Sie den find-Operator-

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

Die obige Abfrage gibt folgende Ergebnisse zurück, die zeigen, dass der Benutzer tom und mark zwei aktive posts haben –

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

Auf ähnliche Weise können MapReduce-Abfragen zur Konstruktion großer und komplexer Aggregation-Abfragen verwendet werden. Die Verwendung von benutzerdefinierten Javascript-Funktionen, die MapReduce nutzen, ist sehr flexibel und leistungsfähig.