Frågebyggare
DocStore och SegmentedLog exponerar query(). DocStore kan använda sekundära
index; SegmentedLog tillämpar samma predikat på strömmade poster.
$records = $docs
->query()
->where('kind')->eq('page')
->where('status')->in(['draft', 'published'])
->where('publishedAt')->between($from, $until)
->orderBy('publishedAt', 'desc')
->limit(50)
->get();
Användbara terminalmetoder:
$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();
På DocStore kan två eq-villkor för icke-unika likhetsindexerade fält
använda en automatisk sammansatt hink. Enkel likhet, in och intervalloperatorer
fortsätter att använda sina konfigurerade fältindex.
Operatorer:
eq,neqin,notIngt,gte,lt,lte,betweenexists,missingprefixandWhere,orWhereorderBy,limit,cursor,page
andWhere och orWhere använder återanrop eftersom and och or är reserverade PHP-nyckelord:
$docs->query()
->where('kind')->eq('page')
->orWhere(fn ($q) => $q->where('kind')->eq('post')->where('featured')->eq(true))
->get();
Kedjade anrop till where() kombineras med AND; varje orWhere()-gren lägger till ett
alternativ.
Så här körs det
Varje villkor fungerar för varje samling; index påverkar bara kostnaden.
På DocStore går eq och in via likhetsindex, intervalloperatorerna och prefix går via intervallindex, och orderBy med
limit på ett intervallindexerat fält läser i indexordning. Allt annat
filtrerar en postskanning. orderBy på ett fält som frågeplaneraren inte kan hantera med ett index sorterar de
matchande posterna i PHP, så kombinera det med indexerade villkor för stora samlingar.
count() använder antalet indexposter på DocStore och räknare i minnet
på SegmentedLog när filtret är en enda likhet.
cursor($id) begränsar resultaten till poster efter id:t, vilket kombineras med
page() för stabil sidnumrering sorterad efter post-id. För vanliga strömningsfilter
utan byggaren, se Frågor.