Lad os komme til dit spørgsmål et efter et:
At se på ydeevnemålinger fra kun en enkelt udførelse er virkelig ikke, hvordan det fungerer. Du bør tage gennemsnittet over flere henrettelser, før du konkluderer, fordi der er flere faktorer, der spiller ind. Når det er sagt, cacher MongoDB de mest brugte dokumenter i hukommelsen og gemmer det der, medmindre det skal give hukommelse til et andet dokument. Så hvis en forespørgsel får adgang til dokumenter, der allerede er cachelagret fra en tidligere forespørgsel, burde den være hurtigere.
Også i MongoDB bruger aggregering kun indekser i begyndelsen, hvis nogen. For eksempel $match
og $sort
faser kan bruge indekser. I dit tilfælde $match
er den første pipeline-fase, så det er en sejr.
I MongoDB lagres data i BSON , så datoer er dybest set tal når de sammenlignes. Så der er ingen forskel.
Selvom jeg ikke har testet det, tvivler jeg virkelig på, at time_bucket-tilgangen vil give hurtigere respons. Siden created_at
altid vil stige, vil indekset, i dette tilfælde, også blive tilføjet til slutningen uden time_bucket. Ydermere vil indeksstørrelsen være forholdsvis stor, når den oprettes på et array end på et simpelt datofelt. Vil det ikke forårsage problemet med at tilpasse indekset i RAM.
Det giver mening at bruge en time_bucket, når du bruger en funktion i datofeltet før matchning. Hvis du kun udtrækker år fra datofeltet før matchning, vil det gøre det eksisterende indeks på datoen ubrugeligt.
Det er altid bedre at caste dine parametre til at matche datatypen i databasen i stedet for omvendt.
Ja, det er muligt. Hvis det er $and
, du skal blot angive alle dine filtre adskilt af kommaer i $match
fase. Hvis det er $or
brug $or
operatør.
Hvis du har to $macth faser én efter én MongoDB kombinerer det til én
. Så du behøver ikke bekymre dig om at tilføje resultater fra flere kampfaser.
Nu din Optimering Points
Ja, dækkede forespørgsler er meget hurtigere.
Hvis størrelsen af dokumenter er reduceret i $gruppen
fase ved brug af $project
, så ja det er sandt.
Det er ikke nødvendigvis sandt, men det er generelt tilfældet. Du kan tjekke dette svar .