Velocità MongoDB {aggregation $ match} vs {find}

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 è qualcosa del tipo: $match > $group > $ group > $project

Tuttavia, ho notato che le ultime parti richiedono solo pochi ms, l’inizio è il più lento.

Ho provato a eseguire una query con solo il filtro $ match e poi a 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 usare le query di ricerca invece delle 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,

MODIFICARE :

Ecco i miei criteri:

 { "action" : "click", "timestamp" : { "$gt" : ISODate("2015-01-01T00:00:00Z"), "$lt" : ISODate("2015-02-011T00:00:00Z") }, "itemId" : "5" } 

Lo scopo principale del aggregation framework è di facilitare la ricerca di un gran numero di voci e generare un basso numero di risultati che hanno valore per te.

Come hai detto, puoi anche utilizzare più query di find , ma ricorda che non puoi creare nuovi campi con le query di find . D’altra parte, la fase a $group ti permette di definire i tuoi nuovi campi.

Se si desidera ottenere la funzionalità del aggregation framework , è molto probabile che si debba eseguire una find iniziale (o raggrupparne diversi), estrarre tali informazioni e manipolarle ulteriormente con un linguaggio di programmazione.

La aggregation pipeline potrebbe richiedere più tempo, ma almeno sai che devi solo tenere conto delle prestazioni di un sistema: il motore MongoDB.

Considerando che, quando si tratta di manipolare i dati restituiti da una query di ricerca, è molto probabile che si debba manipolare ulteriormente i dati con un linguaggio di programmazione, aumentando così la complessità a seconda delle complessità del linguaggio di programmazione scelto.

Hai provato a usare explain () per trovare le tue domande? Ti darà un’idea di quanto tempo impiegherà esattamente la query find (). Puoi fare lo stesso per $ match con $ spiegare e vedere se c’è qualche differenza nell’accesso dell’indice e altri parametri.

Anche la parte $ del quadro di aggregazione $ non utilizza l’indicizzazione, quindi deve elaborare tutti i record restituiti dalla fase di corrispondenza $ del framework di aggregazione. Quindi per capire meglio il funzionamento della tua query vedi il set di risultati restituito e se si adatta alla memoria per essere elaborato da MongoDB.