
# Lekérdezésépítő

A `DocStore` és a `SegmentedLog` a `query()` felületét kínálja. A `DocStore` használhat másodlagos indexeket; a `SegmentedLog` ugyanezeket a feltételeket alkalmazza az adatfolyamos rekordokra.

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

Hasznos záró metódusok:

```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();
```

A `DocStore` esetén két `eq` feltétel nem egyedi, egyenlőségi indexelt mezőkön automatikus összetett gyűjtőt használhat. Az egyedi egyenlőség, a `in` és a tartományoperátorok továbbra is a konfigurált mezőindexeket használják.

Operátorok:

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

A `andWhere` és a `orWhere` visszahívási függvényeket használ, mert a `and` és a `or` fenntartott PHP kulcsszavak:

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

Az egymás után láncolt `where()` hívások ÉS kapcsolatba kerülnek; minden `orWhere()` ág egy további lehetőséget ad hozzá.

## Hogyan hajtódik végre

Minden feltétel minden gyűjteményen működik; az indexek csak a művelet költségét módosítják. A `DocStore` esetén a `eq` és a `in` egyenlőségi indexeken keresztül oldódik fel, a tartományoperátorok és a `prefix` tartományindexeken keresztül, a tartományindexelt mezőn végzett `orderBy` a `limit` használatával pedig indexsorrendben olvas. Minden más rekordbejárással szűr. Ha a tervező nem tud indexből kiszolgálni egy mezőre vonatkozó `orderBy` műveletet, az egyező rekordokat memóriában rendezi PHP, ezért nagy gyűjteményeknél kapcsolja össze indexelt feltételekkel. A `count()` indexbejegyzés-számokat használ a `DocStore` esetén, memóriabeli számlálókat pedig a `SegmentedLog` esetén, ha a szűrő egyetlen egyenlőségvizsgálat.

A `cursor($id)` az adott azonosító utáni rekordokra szűkíti az eredményeket; a `page()` művelettel kombinálva stabil, rekordazonosító szerinti lapozást biztosít. A lekérdezésépítő nélküli egyszerű adatfolyamos szűrésről lásd a [Lekérdezések](https://storh.inline0.dev/hu/docs/queries) részt.
