MongoDB - Riduzione mappa
Secondo la documentazione di MongoDB, Map-reduceè un paradigma di elaborazione dei dati per condensare grandi volumi di dati in utili risultati aggregati. MongoDB utilizzamapReducecomando per operazioni di riduzione della mappa. MapReduce viene generalmente utilizzato per l'elaborazione di set di dati di grandi dimensioni.
Comando MapReduce
Di seguito è riportata la sintassi del comando mapReduce di base:
>db.collection.mapReduce(
function() {emit(key,value);}, //map function
function(key,values) {return reduceFunction}, { //reduce function
out: collection,
query: document,
sort: document,
limit: number
}
)
La funzione di riduzione della mappa interroga prima la raccolta, quindi mappa i documenti dei risultati per emettere coppie chiave-valore, che vengono quindi ridotte in base alle chiavi che hanno più valori.
Nella sintassi sopra -
map è una funzione javascript che mappa un valore con una chiave ed emette una coppia chiave-valore
reduce è una funzione javascript che riduce o raggruppa tutti i documenti aventi la stessa chiave
out specifica la posizione del risultato della query di riduzione della mappa
query specifica i criteri di selezione facoltativi per la selezione dei documenti
sort specifica i criteri di ordinamento facoltativi
limit specifica il numero massimo facoltativo di documenti da restituire
Utilizzando MapReduce
Considera la seguente struttura del documento che memorizza i post degli utenti. Il documento memorizza user_name dell'utente e lo stato del post.
{
"post_text": "tutorialspoint is an awesome website for tutorials",
"user_name": "mark",
"status":"active"
}
Ora useremo una funzione mapReduce sul nostro file posts collection per selezionare tutti i post attivi, raggrupparli sulla base di user_name e quindi contare il numero di post di ciascun utente utilizzando il seguente codice:
>db.posts.mapReduce(
function() { emit(this.user_id,1); },
function(key, values) {return Array.sum(values)}, {
query:{status:"active"},
out:"post_total"
}
)
La query mapReduce sopra restituisce il risultato seguente:
{
"result" : "post_total",
"timeMillis" : 9,
"counts" : {
"input" : 4,
"emit" : 4,
"reduce" : 2,
"output" : 2
},
"ok" : 1,
}
Il risultato mostra che un totale di 4 documenti corrispondevano alla query (stato: "attivo"), la funzione mappa ha emesso 4 documenti con coppie chiave-valore e infine la funzione di riduzione ha raggruppato documenti mappati aventi le stesse chiavi in 2.
Per vedere il risultato di questa query mapReduce, usa l'operatore find -
>db.posts.mapReduce(
function() { emit(this.user_id,1); },
function(key, values) {return Array.sum(values)}, {
query:{status:"active"},
out:"post_total"
}
).find()
La query precedente fornisce il seguente risultato che indica che entrambi gli utenti tom e mark hanno due post in stati attivi -
{ "_id" : "tom", "value" : 2 }
{ "_id" : "mark", "value" : 2 }
In modo simile, le query MapReduce possono essere utilizzate per costruire query di aggregazione complesse di grandi dimensioni. L'utilizzo di funzioni Javascript personalizzate fa uso di MapReduce che è molto flessibile e potente.