Ho una collezione mongoDB con milioni di righe e sto cercando di ottimizzare le mie query. Attualmente sto usando il framework di aggregazione per recuperare i dati e raggrupparli come voglio. La mia tipica query di aggregazione è simile a: $match > $group > $ group > $project
Tuttavia, ho notato che le ultime parti richiedono solo pochi ms, l'inizio è il più lento.
Ho tentato di eseguire una query con solo il filtro di corrispondenza $ e quindi di eseguire la stessa query con collection.find. La query di aggregazione richiede ~ 80 ms mentre la query di ricerca impiega 0 o 1 ms.
Ho indici su praticamente ogni campo quindi immagino che questo non sia il problema. Qualche idea su cosa potrebbe andare storto? O è solo un "normale" svantaggio della struttura di aggregazione?
Potrei utilizzare le query di ricerca anziché le query di aggregazione, tuttavia dovrei eseguire molte elaborazioni dopo la richiesta e questo processo può essere eseguito rapidamente con $group
ecc. Quindi preferirei mantenere il framework di aggregazione.
Grazie,
EDIT:
Ecco i miei criteri:
{
"action" : "click",
"timestamp" : {
"$gt" : ISODate("2015-01-01T00:00:00Z"),
"$lt" : ISODate("2015-02-011T00:00:00Z")
},
"itemId" : "5"
}
Puoi pubblicare il tuo '$ match' e trovare?Nella maggior parte degli usi, un '$ match' e un find dovrebbero essere equivalenti, ma mi piacerebbe vedere esattamente quali dichiarazioni si stanno confrontando per ottenere una risposta precisa. Inoltre, hai prima eseguito l'aggregazione e poi la ricerca? Cosa succede se ripeti i due più e più volte e confronta i tempi? La differenza avrebbe potuto essere il costo di spostare i risultati in memoria dal disco. – wdberkeley
Ho aggiunto i criteri al primo post, tuttavia anche senza i criteri di timestamp vedo un grosso gap. Ma ora mi chiedo se non è legato al fatto che find() restituisce un cursore e mostra solo i primi risultati. – Owumaro
Ok, avevo un sacco di indici inutili, quindi ho pulito tutto e creato solo un indice composto (con i campi del mio filtro $ match). Ora ho buone prestazioni e stesse prestazioni per trovare e aggregare con $ match :) Problema risolto. – Owumaro