Sono un novizio relativo a MongoDB, ma da quello che ho letto ci sono vari metodi per trovare medie e somme di valori in un database MongoDB, con vari vantaggi e svantaggi per ciascuno.Funzionalità 'AVG' e 'SUM' in MongoDB, qualche consiglio?
Sto principalmente chiedendo un metodo per trovare la somma di una selezione di valori e la media di una selezione di valori, in un metodo efficiente (veloce) possibile.
I documenti della collezione interrogato assomigliano tale struttura (con un sacco di altri campi):
{
"_id": ObjectId('4e650107580fd649e5000005'),
"date_added": ISODate("2011-09-05T00:00:00Z"),
"value": 1500
}
precalcolato cose come somme è, nella mia domanda, non sempre è possibile, perché la selezione di valori essere sommato può cambiare (in base agli intervalli di date, ad esempio tra una data di inizio e una data di fine, qual è la media). Questo è un problema simile con le medie di calcolo preliminare.
Da quello che ho letto, MapReduce non è sicuramente l'ideale per la ricerca in tempo reale (cioè su richiesta), quindi sembra essere fuori discussione anche tu.
Al momento mi sto interrogando la raccolta in questo modo: (Nota: Questo sta usando pymongo
)
response = request.db['somecollection'].find(
{
'date_added': {
'$gte': date_start,
'$lte': date_end
}
},
{
'value':1
}
).limit(500)
Poi facendo il calcolo in Python utilizzando un ciclo for
sopra la risposta. Il limite di 500 risultati è arbitrario, per evitare che diventi troppo lento. Sto solo recuperando il valore e nessuno degli altri campi.
È questo il metodo più efficiente per eseguire questo calcolo o esistono altri metodi per eseguire ciò che mi serve?
Avvertenze:
- non posso utilizzare la funzione
group
perché io probabilmente utilizzerò sharding in futuro - Non posso usare MapReduce perché è una funzione che verrà utilizzato su -the-fly dagli utenti
- Non riesco a calcolare molto le mie somme/medie perché la selezione dei valori per somma/media è quasi sempre diversa
- Mi sono guardato attorno allo stackoverflow e al web per provare trovare raccomandazione su come fare questo genere di cose, ed è abbastanza indeterminato
EDIT:
Tengo a precisare che il numero di documenti restituiti dalla query che ho postato qui sopra potrebbe essere qualsiasi cosa da 1 documento a centinaia, ma probabilmente avrà un numero massimo di documenti restituiti di circa 150 (media di circa 60 o 70)
Sto sicuramente sperimentando di più con MapReduce. So che varierà tra i dataset/query/ecc., Ma nel tuo caso è stato abbastanza veloce da non essere realmente visibile all'utente (cioè meno di mezzo secondo)? – johneth
Variabile tra 500-5000 ms, ma alcuni set di dati erano piuttosto grandi (100 M + doc), quindi era necessario un indicatore di occupato/progresso, ma abbastanza veloce. Le prestazioni di riduzione della mappa dovrebbero anche migliorare quando il motore JavaScript viene aggiornato da SpiderMonkey a thread singolo a V8. –
Ah, sembra promettente. Al momento il mio set di dati è molto piccolo (misurato in migliaia, non in milioni), anche se questo crescerà nel tempo. – johneth