Preskoči na vsebino

Gradnik poizvedb

DocStore in SegmentedLog omogočata query(). DocStore lahko uporablja sekundarne indekse; SegmentedLog uporablja iste pogoje za filtriranje pretočnih zapisov.

PHP
$records = $docs
    ->query()
    ->where('kind')->eq('page')
    ->where('status')->in(['draft', 'published'])
    ->where('publishedAt')->between($from, $until)
    ->orderBy('publishedAt', 'desc')
    ->limit(50)
    ->get();

Uporabne zaključne metode:

PHP
$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();

Pri DocStore lahko dva pogoja eq za enakost na neunikatnih indeksiranih poljih uporabita samodejno sestavljeno vedro. Posamezna enakost, in in operatorji razpona še naprej uporabljajo konfigurirane indekse polj.

Operatorji:

  • eq, neq
  • in, notIn
  • gt, gte, lt, lte, between
  • exists, missing
  • prefix
  • andWhere, orWhere
  • orderBy, limit, cursor, page

andWhere in orWhere uporabljata povratne klice, ker sta and in or rezervirani ključni besedi PHP:

PHP
$docs->query()
    ->where('kind')->eq('page')
    ->orWhere(fn ($q) => $q->where('kind')->eq('post')->where('featured')->eq(true))
    ->get();

Verižni klici where() se združujejo z AND; vsaka veja orWhere() doda alternativo.

Kako se izvajajo poizvedbe

Vsak pogoj deluje v vsaki zbirki; indeksi vplivajo le na stroške. Pri DocStore se eq in in razrešita prek indeksov enakosti, operatorji razpona in prefix prek indeksov razpona, orderBy z limit na polju z indeksom razpona pa bere v vrstnem redu indeksa. Vse drugo filtrira pregled zapisov. orderBy na polju, ki ga načrtovalnik ne more obravnavati z indeksom, razvrsti ujemajoče se zapise v PHP, zato ga pri velikih zbirkah združite z indeksiranimi pogoji. count() uporablja število vnosov v indeksu pri DocStore in števce v pomnilniku pri SegmentedLog, kadar je filter ena sama enakost.

cursor($id) omeji rezultate na zapise za danim ID-jem, kar se združi z page() za stabilno ostranjevanje, razvrščeno po ID-ju zapisa. Za navadne pretočne filtre brez gradnika glejte Poizvedbe.