Przejdźmy do Twojego pytania jeden po drugim:
Patrzenie na wskaźniki wydajności z pojedynczego wykonania tak naprawdę nie działa. Powinieneś wziąć średnią z kilku egzekucji, zanim wyciągniesz wnioski, ponieważ w grę wchodzi kilka czynników. Mając to na uwadze, MongoDB buforuje najczęściej używane dokumenty w pamięci i przechowuje je tam, chyba że musi wykorzystać pamięć dla innego dokumentu. Więc jeśli zapytanie uzyskuje dostęp do dokumentów już zapisanych w pamięci podręcznej z poprzedniego zapytania, powinno to być szybsze.
Również w MongoDB agregacja używa indeksów tylko na początku, jeśli takie istnieją. Na przykład $match
i $sort
fazy mogą używać indeksów. W Twoim przypadku $match
jest pierwszym etapem potoku, więc jest to wygrana.
W MongoDB dane są przechowywane w BSON , więc daty są w zasadzie liczbami kiedy są porównywane. Więc nie ma różnicy.
Chociaż nie testowałem tego, naprawdę wątpię, aby podejście time_bucket dało szybszą reakcję. Od created_at
będzie zawsze rosła, indeks w tym przypadku również zostanie dołączony na końcu bez time_bucket. Co więcej, rozmiar indeksu będzie stosunkowo duży, gdy zostanie utworzony na tablicy niż w prostym polu daty. Czy to nie spowoduje problemu z dopasowaniem indeksu do pamięci RAM.
Użycie time_bucket ma sens, gdy przed dopasowaniem używasz jakiejś funkcji w polu daty. Jeśli przed dopasowaniem wyodrębnisz tylko rok z pola daty, istniejący indeks w tej dacie stanie się bezużyteczny.
Zawsze lepiej jest rzutować parametry tak, aby pasowały do typu danych w bazie danych, zamiast na odwrót.
Tak, to możliwe. Jeśli to $ i
, wystarczy określić wszystkie filtry oddzielone przecinkami w $match
faza. Jeśli jest to $lub
użyj $lub
operator.
Jeśli masz dwa $macth fazy jedna po drugiej MongoDB łączy je w jedną
. Nie musisz się więc martwić o dodawanie wyników wielu faz meczu.
Teraz Twoja Optymalizacja Punkty
Tak, zapytania objęte zakresem są znacznie szybsze.
Jeśli rozmiar dokumentów jest zmniejszony w grupie $
etap za pomocą $projektu
, to tak, to prawda.
Niekoniecznie to prawda, ale generalnie tak jest. Możesz sprawdzić tę odpowiedź .