Pojďme k vaší otázce jeden po druhém:
Dívat se na metriky výkonu pouze z jednoho provedení opravdu nefunguje. Než uzavřete závěr, měli byste vzít průměr za několik provedení, protože ve hře je několik faktorů. Jak již bylo řečeno, MongoDB ukládá nejčastěji používané dokumenty do paměti a uchovává je tam, pokud nemusí uvolnit paměť pro nějaký jiný dokument. Pokud tedy dotaz přistupuje k dokumentům již uloženým v mezipaměti z předchozího dotazu, měl by být rychlejší.
Také v MongoDB agregace používá indexy pouze na začátku, pokud existují. Například $match
a $sort
fáze mohou používat indexy. Ve vašem případě $match
je první fáze potrubí, takže to je výhra.
V MongoDB jsou data uložena v BSON , takže data jsou v podstatě čísla když se porovnávají. Takže v tom není žádný rozdíl.
Ačkoli jsem to netestoval, opravdu pochybuji, že přístup time_bucket poskytne rychlejší odezvu. Od created_at
se vždy zvýší, index bude v tomto případě také připojen na konec bez time_bucket. Kromě toho bude velikost indexu při vytváření na poli poměrně velká než na jednoduchém datovém poli. Nezpůsobí to problém s umístěním indexu do paměti RAM.
Použití time_bucket má smysl, když před párováním používáte nějakou funkci v datovém poli. Pokud z pole data před párováním extrahujete pouze rok, bude stávající index k datu nepoužitelný.
Vždy je lepší přetypovat parametry tak, aby odpovídaly datovému typu v databázi, než naopak.
Ano, je to možné. Pokud je to $and
, stačí zadat všechny své filtry oddělené čárkami v $match
fáze. Pokud je to $or
použijte $or
operátor.
Pokud máte dva $macth
fáze jedna po druhé MongoDB je kombinuje do jedné
. Nemusíte si tedy dělat starosti s přidáváním výsledků více fází zápasu.
Nyní vaše Optimalizace Body
Ano, pokryté dotazy jsou mnohem rychlejší.
Pokud je velikost dokumentů zmenšena ve $group
fázi pomocí $project
, pak ano, je to pravda.
Nemusí to být nutně pravda, ale obecně to tak je. Můžete zkontrolovat tuto odpověď .