In MongoDB, sto provando a scrivere le funzioni di Riduzione mappa che salva solo i dati se soddisfa determinati criteri.Come faccio a non salvare i dati nella mia funzione reduce() in MongoDB?
Non riesco a capire come non emit() dal mio riduttore. Salva sempre i dati, in un modo o nell'altro.
Ecco un esempio generico. Ignora il contesto dei dati: ho creato questi dati e codice esclusivamente per lo scopo di questa domanda.
Data Set:
{ "_id" : ObjectId("52583b3a58da9769dda48853"), "date" : "01-01-2013", "count" : 1 }
{ "_id" : ObjectId("52583b3d58da9769dda48854"), "date" : "01-01-2013", "count" : 1 }
{ "_id" : ObjectId("52583b4258da9769dda48855"), "date" : "01-02-2013", "count" : 1 }
{ "_id" : ObjectId("52583b4f58da9769dda48856"), "date" : "01-03-2013", "count" : 4 }
Mappa Funzione:
// Map all data by (date, count)
var map = function() {
var key = this.date;
var value = this.count;
emit(key, value);
}
Reducer che semplicemente ignora i dati indesiderati.
// Only save dates which have count > 2
var reducer = function(date, counts) {
var sum = Array.sum(counts);
if (sum > 2) {
return sum;
}
}
Risultati (valore di 1 non è stato ignorato):
{ "_id" : "01-01-2013", "value" : null }
{ "_id" : "01-02-2013", "value" : 1 }
{ "_id" : "01-03-2013", "value" : 4 }
Ho anche aggiunto in una dichiarazione di ritorno vuoto, ma ho ottenuto gli stessi risultati:
// Only save dates which have count > 2
var reducer = function(date, counts) {
var sum = Array.sum(counts);
if (sum > 2) {
return sum;
}
else return;
}
Quello che vorrei Per avere successo sono solo i seguenti dati esistere nella mia collezione di output dopo l'esecuzione di Map-Reduce. Come posso realizzare questo?
{ "_id" : "01-03-2013", "value" : 4 }
Questo è intelligente! Dovrò fare una corsa per vedere quanto è veloce quando ho eseguito i miei dati reali, ma è un trucco abbastanza buono per raggiungere l'obiettivo. Grazie. – Kurtis
Non farei una mappa/riduci se stai solo cercando di filtrare alcuni risultati. Basta fare una rimozione dopo la prima mappa/riduci: db.mroutput.remove ({value: {$ lte: 2}}). Remove() verrà eseguito molto più velocemente di una mappa/riduci. –
@RobMoore Hai ragione; questa è una soluzione più semplice e potenzialmente più efficiente. Penso che dovresti postarlo come una risposta separata. – GolfWolf