Latest web development tutorials

MongoDB Karte verkleinern

Map-Reduce ist ein Rechenmodell, bedeutet einfach, dass der Großteil der Arbeit (Daten) Zersetzung (MAP) durchzuführen und die Ergebnisse dann in einem abschließenden Ergebnis verschmelzen (REDUCE).

MongoDB bietet eine Map-Reduce sehr flexibel für eine groß angelegte Datenanalyse ist auch ganz praktisch.


MapReduce Befehl

Im Folgenden wird die grundlegende Syntax von MapReduce:

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

Mit MapReduce-Funktionen die beiden Funktionen Karte zu erreichen und Funktionen reduzieren, Map-Funktionsaufruf emittieren (Schlüssel, Wert), durchqueren die Sammlung in allen Datensätzen, und der Schlüsselwert wird auf die Reduzierung der Funktion zur Bearbeitung weitergeleitet.

Map-Funktion muss emittieren (Schlüssel, Wert) Aufruf gibt Paare.

Parameter Beschreibung:

  • Karte: Mapping - Funktion (erzeugen Tastenfolgen als Funktionsparameter zu reduzieren).
  • statistische Funktionen zureduzieren, ist die Aufgabe , die Funktionstaste-Werte in einen Schlüssel-Wert zu reduzieren, das heißt, die Werte - Array in einem einzigen Wert Wert..
  • aus statistischen Ergebnisse gespeicherten Satz (nicht angeben , die Verwendung von temporären Sammlung automatisch gelöscht , nachdem ein Client getrennt ist ).
  • nur eineAbfrage Filterbedingung, die Bedingungen des Dokuments zu treffen Map - Funktion aufgerufen werden.(Query.limit kann Art mischen)
  • Art und Grenze sortieren Parameterbindung (auch ein ehemaliger Dokument an die Kartenfunktion gesendet zu sortieren), können Sie die Gruppierungsmechanismus optimieren
  • begrenzen Sie die Anzahl der Dokumente an die obere Grenze der Kartenfunktion gesendet (wenn es keine Grenze, allein Art von geringem Nutzen)

Verwenden Sie MapReduce

Betrachten Sie das folgende Dokumentstruktur des Benutzers Artikel, Dokumente zu speichern und speichert den Benutzer user_name Artikel Statusfeld:

>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 })

Jetzt werden wir die Beiträge eingestellt verkleinern Funktion verwenden, um einen veröffentlichten Artikel zu wählen (Status: "aktiv") und durch user_name Paket für jeden Benutzer Beiträge berechnet:

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

Oberhalb verkleinern Ausgabe lautet:

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

Die Ergebnisse zeigten, dass insgesamt vier den Abfragekriterien entsprechen (Status: "aktiv") Dokumente generiert vier Schlüssel in der Map-Funktion in dem Dokument, und dann die gleiche Funktion verwenden, um Schlüssel in zwei Gruppen unterteilt reduzieren.

Spezifische Parameter:

  • Ergebnis: speichern die Ergebnisse des Namens der Sammlung, ist dies eine temporäre Rückschlag aus der automatischen Verbindung von MapReduce gelöscht wurde.
  • timeMillis: Ausführung nimmt Zeit in Millisekunden
  • Eingabe: die Bedingung Nummer des Dokuments wird auf die Kartenfunktion gesendet
  • emittieren: mal in Kartenfunktion emit genannt wird, das heißt, die Gesamtmenge aller Datensammlung
  • Anzahl der Treffer Ergebnisse in der Sammlung (Zählung ist sehr nützlich für das Debuggen): ouput
  • ok: Erfolg, Erfolg 1
  • Fehler: Wenn es fehlschlägt, kann es einen Grund zum Scheitern verurteilt sein, aber aus der Erfahrung, ist der Grund, vage, nicht sehr nützlich

Mit dem Fund Bediener die Abfrageergebnisse verkleinern von anzuzeigen:

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

Die Ergebnisse der obigen Abfrage wird unten gezeigt, gibt es zwei Benutzer tom und markieren Sie zwei Artikel veröffentlicht:

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

In ähnlicher Weise kann MapReduce verwendet werden große, komplexe Aggregat Abfragen aufzubauen.

Map-Funktion und die Reduzierung von Funktionen implementiert werden können mit Hilfe von JavaScript, MapReduce Einsatz sehr flexibel und leistungsfähig zu machen.