Veniamo alla tua domanda una per una:
Guardare le metriche delle prestazioni da una singola esecuzione non è davvero come funziona. Dovresti prendere la media di diverse esecuzioni prima di concludere perché ci sono diversi fattori in gioco. Detto questo, MongoDB memorizza nella cache i documenti utilizzati più di frequente e li mantiene lì a meno che non debba cedere memoria per qualche altro documento. Quindi, se una query accede a documenti già memorizzati nella cache da una query precedente, dovrebbe essere più veloce.
Anche in MongoDB l'aggregazione utilizza gli indici solo all'inizio, se presenti. Ad esempio $match
e $sort
le fasi possono utilizzare gli indici. Nel tuo caso $match
è la prima fase della pipeline, quindi è una vittoria.
In MongoDB i dati sono archiviati in BSON , quindi le date sono fondamentalmente numeri quando vengono confrontati. Quindi non c'è differenza.
Anche se non l'ho testato, dubito davvero che l'approccio time_bucket darà una risposta più rapida. Dal momento che created_at
aumenterà sempre, l'indice, in questo caso, verrà aggiunto anche alla fine senza il time_bucket. Inoltre, la dimensione dell'indice sarà relativamente grande quando viene creata su un array rispetto a un semplice campo data. Ciò non causerà il problema dell'adattamento dell'indice nella RAM.
L'uso di un time_bucket ha senso quando si utilizzano alcune funzioni nel campo della data prima della corrispondenza. Se estrai solo il campo dell'anno dalla data prima della corrispondenza, renderà inutile l'indice esistente sulla data.
È sempre meglio eseguire il cast dei parametri in modo che corrispondano al tipo di dati nel database anziché viceversa.
Si è possibile. Se è $and
, devi solo specificare tutti i filtri separati da virgole nel $match
fase. Se è $or
usa $or
operatore.
Se hai due $macth
fasi uno per uno MongoDB lo combina in uno
. Quindi non devi preoccuparti di aggiungere i risultati di più fasi di corrispondenza.
Ora la tua ottimizzazione Punti
Sì, query coperte sono molto più veloci.
Se la dimensione dei documenti è ridotta nel $group
stage utilizzando $project
, allora sì è vero.
Non è necessariamente vero, ma generalmente è così. Puoi controllare questa risposta .