MapReduce per valori dei parametri di conteggio
Domanda
Ho documento come questo:
{
"_id": ObjectId("4d17c7963ffcf60c1100002f"),
"title": "Text",
"params": {
"brand": "BMW",
"model": "i3"
}
}
{
"_id": ObjectId("4d17c7963ffcf60c1100002f"),
"title": "Text",
"params": {
"brand": "BMW",
"model": "i5"
}
}
Che cosa ho bisogno è il conteggio di ogni valori Parametri. come:
brand
---------
BMW (2)
model
---------
i3 (1)
i5 (1)
Credo che devo alla mappa di scrittura / ridurre funzioni. Come posso fare questo? Grazie.
Soluzione
Credo che devo alla mappa di scrittura / ridurre funzioni.
Sì avete bisogno di una mappa-ridurre per questo. Per alcuni semplici mappa-ridurre esempi, un'occhiata qui .
Per il vostro caso particolare, è necessario prima di cambiare la vostra aspettativa di uscita. L'uscita della mappa / ridurre è una raccolta. La collezione sarà (nel tuo caso) qualcosa di simile:
{ key : { 'brand' : 'bmw' }, value : 2 }
{ key : { 'model' : 'i5' }, value : 1 }
Per generare questo set avrete bisogno di una funzione di "mappa" e una funzione di "ridurre". La funzione "mappa" emetterà una chiave e un valore. La chiave è ogni elemento params, il valore è il conteggio di 1. Il "ridurre" funzione accetta una chiave ed una matrice di valori e restituisce un singolo valore. La tua domanda è fondamentalmente lo stesso come questo esempio sulla MongoDB sito :
map = function() {
if (!this.params) {
return;
}
for (index in this.params) {
emit(this.params[index], 1);
}
}
reduce = function(previous, current) {
var count = 0;
for (index in current) {
count += current[index];
}
return count;
}
Altri suggerimenti
Nella funzione mappa enumerare le proprietà della proprietà params dell'oggetto this
. Per ogni proprietà a trovare emit
chiamata con una chiave che contiene sia il nome della proprietà e il valore della proprietà. Passare 1 come valore. per esempio. emit({'brand','BMW'}, 1)
ma, ovviamente, utilizzando variabili non costanti!
Nella funzione di ridurre si sono passati una chiave e un array di valori. Sommare questi valori e restituire la somma. Anche se la matrice iniziale sarà tutti i 1 di non essere tentati di utilizzare la lunghezza della matrice perché la funzione di ridurre può essere chiamato in modo iterativo.
È possibile raggruppare i risultati in seguito dal risultato di raccolta, applicando un indice, se necessario, per le prestazioni.