Konstruktor zapytań
DocStore i SegmentedLog udostępniają query(). DocStore może korzystać z indeksów pomocniczych; SegmentedLog stosuje te same predykaty do strumieniowanych rekordów.
$records = $docs
->query()
->where('kind')->eq('page')
->where('status')->in(['draft', 'published'])
->where('publishedAt')->between($from, $until)
->orderBy('publishedAt', 'desc')
->limit(50)
->get();
Przydatne metody końcowe:
$docs->query()->where('slug')->eq('home')->first();
$docs->query()->where('kind')->eq('page')->count();
$docs->query()->cursor($lastId)->page(100)->get();
$docs->query()->where('slug')->eq('home')->explain();
W DocStore dwa warunki eq dotyczące pól z nieunikalnym indeksem równości mogą
korzystać z automatycznego indeksu złożonego. Pojedynczy warunek równości, in i operatory zakresu
nadal korzystają ze skonfigurowanych indeksów pól.
Operatory:
eq,neqin,notIngt,gte,lt,lte,betweenexists,missingprefixandWhere,orWhereorderBy,limit,cursor,page
andWhere i orWhere używają funkcji zwrotnych, ponieważ and i or są zarezerwowanymi słowami kluczowymi PHP:
$docs->query()
->where('kind')->eq('page')
->orWhere(fn ($q) => $q->where('kind')->eq('post')->where('featured')->eq(true))
->get();
Łańcuchowe wywołania where() łączą warunki operatorem AND; każda gałąź orWhere() dodaje
alternatywę.
Sposób wykonywania zapytań
Każdy warunek działa w każdej kolekcji; indeksy wpływają tylko na koszt.
W DocStore eq i in korzystają z indeksów równości, operatory zakresu i prefix korzystają z indeksów zakresu, a orderBy z limit dla pola z indeksem zakresu odczytuje dane w kolejności indeksu. Pozostałe przypadki filtrują wyniki skanowania rekordów. orderBy dla pola, którego planer nie może obsłużyć za pomocą indeksu, sortuje
pasujące rekordy w pamięci PHP, więc w dużych kolekcjach łącz je z warunkami korzystającymi z indeksów. count() używa liczby wpisów w indeksie w DocStore oraz liczników w pamięci w SegmentedLog, jeśli filtr dotyczy pojedynczej równości.
cursor($id) ogranicza wyniki do rekordów po wskazanym identyfikatorze; w połączeniu z page() zapewnia stabilne stronicowanie posortowane według identyfikatora rekordu. Informacje o prostych filtrach strumieniowych bez konstruktora znajdziesz w sekcji Zapytania.