Latest web development tutorials

MongoDB Mappa Ridurre

Map-Reduce è un modello di elaborazione, significa semplicemente che il grosso del lavoro (dati) di decomposizione (MAP) per eseguire, e quindi unire i risultati in un risultato finale (RIDURRE).

MongoDB fornisce una mappa-Reduce è molto flessibile per l'analisi dei dati su larga scala è anche molto pratico.


comando di MapReduce

Quanto segue è la sintassi di base di MapReduce:

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

Utilizzo delle funzioni MapReduce per realizzare le due funzioni Mappa e ridurre funzioni, Mappa funzione di chiamata emette (chiave, valore), attraversare la raccolta di tutti i record, e il valore della chiave viene passato alla funzione Riduzione per l'elaborazione.

la funzione Map deve chiamare emettono (chiave, valore) Restituisce coppie.

Descrizione Parametro:

  • funzione di mappatura (generare sequenze di tasti come ridurre parametri dellafunzione): Mappa.
  • ridurre le funzioni statistiche, il compito è quello di ridurre i valori-chiave di funzione in un valore-chiave, vale a dire, la matrice dei valori in un singolo valore di valore..
  • fuori risultati statistici memorizzati set (non specificare l'uso di raccolta temporanea cancellati automaticamente dopo un client viene scollegato).
  • una condizione di filtro diquery, solo per soddisfare le condizioni del documento sarà chiamato mappa funzione.(Query.limit, tipo può miscelare)
  • ordinamento e limite vincolante sort parametro (anche un ex documento inviato alla funzione mappa per ordinare), è possibile ottimizzare il meccanismo di raggruppamento
  • limitare il numero di documenti inviati al limite superiore della funzione mappa (se non vi è alcun limite, solo tipo di scarsa utilità)

Usa MapReduce

Si consideri il seguente struttura del documento per memorizzare articoli, documenti dell'utente, e memorizza il campo status dell'articolo utente nome_utente:

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

Ora useremo i messaggi impostati funzione MapReduce per selezionare un articolo pubblicato (stato: "attivo"), e dal pacchetto nome_utente calcolato per ogni utente Messaggi:

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

Sopra MapReduce output è:

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

I risultati hanno mostrato che un totale di quattro corrispondono ai criteri di query (stato: "attivi") i documenti generati quattro chiave nella funzione di mappa nel documento, e quindi utilizzare la stessa funzione per ridurre la chiave divisi in due gruppi.

Parametri specifici:

  • risultato: memorizzare i risultati del nome della collezione, questo è un insieme temporanea arretrata rispetto alla connessione automatica di MapReduce è stato eliminato.
  • timeMillis: esecuzione richiede tempo, in millisecondi
  • ingresso: il numero di condizionamento del documento viene inviato alla funzione cartina
  • emettere volte in funzione mappa emettono viene chiamata, cioè, la quantità totale di tutta la linea di dati
  • ouput: Risultati Numero di documenti della collezione (conteggio è molto utile per il debug)
  • ok: il successo, il successo 1
  • ERR: Se fallisce, ci può essere un motivo per fallire, ma dall'esperienza, il motivo è vaga, non molto utile

Utilizzando l'operatore find per visualizzare i risultati della query MapReduce di:

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

I risultati della query di cui sopra è riportato qui di seguito, ci sono due utenti tom e segnare due articoli pubblicati:

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

In modo simile, MapReduce può essere utilizzato per costruire grandi e complessi query di aggregazione.

funzione funzioni Mappa e ridurre possono essere implementate utilizzando JavaScript, MapReduce fanno uso di molto flessibile e potente.