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.