Co je to?
Poznámka pro administrátora: Jedná se o výkonný nástroj pro získávání dat, který slouží k načítání, filtrování a sumarizaci informací z vašeho e-shopu. Představte si ho jako způsob, jak “klást otázky” o vašich datech, abyste získali přesně ty odpovědi, které potřebujete.
Pro koho je to určeno? Administrátor by si to měl přečíst, aby pochopil možnosti analýzy dat systému. Konkrétní pokyny a příklady kódu jsou však určeny pro vývojáře k implementaci do vašich integrací nebo vlastních reportů.
Klíčové výhody pro e-shop:
- Flexibilní reportování: Získejte přesně ta data, která potřebujete pro vlastní tabulky nebo dashboardy, bez zbytečného “šumu.”
- Analýza trendů: Automaticky seskupujte prodejní nebo produktová data podle časových období, abyste viděli, jak vaše podnikání roste.
- Cestování časem: Zobrazte si přesně, jak vaše data vypadala v jakémkoli okamžiku v minulosti, abyste vyřešili nesrovnalosti nebo auditovali změny.
- Inteligentní doplňování dat: Zajistěte, aby vaše grafy vypadaly profesionálně, automatickým doplňováním “mezer” ve dnech, kdy nedošlo k žádným prodejům.
Přehled
Náš dotazovací jazyk je inspirován GraphQL, ale je navržen pro SQL-založené backendy a adaptaci REST API. Používá známou, vnořenou a expresivní syntaxi, která eliminuje problém N+1 prostřednictvím inteligentního dávkování a optimalizace dotazů.
card: Inspirováno GraphQL
Známá vnořená syntaxe s výběrem entit, specifikací polí a podporou parametrů
card: Kompatibilní s REST
Dokáže překládat dotazy na REST koncové body pro kompatibilitu s existujícími službami
card: Optimalizováno pro výkon
Eliminuje problémy N+1 SQL prostřednictvím automatického dávkování a optimalizace dotazů
Příklady dotazů
Základní dotaz
Načtení všech polí z entity [badge:Základní|info|right]
products {
id
name
price
description
}
Dotaz s parametry
Použití parametrů pro filtrování a stránkování [badge:Parametry|info|right]
products(
where: "status = 'active'",
limit: 10,
orderBy: [name@asc]
) {
id
name
price
}
Vnořené relace
Načtení souvisejících entit v jediném dotazu [badge:Relace|info|right]
products {
id
name
category {
id
name
}
variants(limit: 10) {
id
price
}
}
Dotaz s agregacemi
Zahrnutí agregačních funkcí do dotazu [badge:Agregace|info|right]
products(
where: "price > 100"
) {
id
name
@count as total_products
@sum(price) as total_price
}
Funkce polí
Aplikace funkcí na pole pro transformace [badge:Funkce|info|right]
categories() {
name,
length(name) as name_length,
isnull(description) as has_no_description,
upper(code) as code_upper
}
Funkce data
Extrahování komponent data/času z polí [badge:Funkce|info|right]
orders() {
id,
order_date,
year(order_date) as order_year,
month(order_date) as order_month,
quarter(order_date) as order_quarter,
dayofweek(order_date) as weekday
}
Funkce rozsahu dat
Získání přesných hranic časového období pro analýzy [badge:Funkce|info|right]
analytics() {
id,
event_date,
startOfYear(event_date) as year_start,
endOfYear(event_date) as year_end,
startOfMonth(event_date) as month_start,
endOfMonth(event_date) as month_end,
startOfHour(event_date) as hour_start,
endOfHour(event_date) as hour_end
}
GROUP BY s funkcemi
Použití funkcí při seskupování agregací [badge:Agregace|info|right]
sales(
@count as total_sales,
@sum(amount) as total_revenue,
@groupBy(year(sale_date), month(sale_date))
) { * }
Pojmenujte seskupenou funkci pomocí as, abyste získali předvídatelný sloupec ve výsledku, a zkombinujte období s jiným polem:
journalEntries(
where: "isPosted = true",
@groupBy(yearquarter(accountingDate) as period, debitAccountCode),
@sum(amount) as amount
) { }
Každý řádek výsledku obsahuje period (např. 2026-Q1), debitAccountCode a amount.
Doplnění mezer pro grafy časových řad
Doplnění chybějících období ve seskupených výsledcích pro souvislé grafy [badge:Agregace|info|right]
orders(
@count as order_count,
@sum(total) as monthly_revenue,
@groupBy(yearmonth(created_at)),
@fillGaps(yearmonth(created_at))
) { }
S explicitním rozsahem dat (rozšíření za hranice dat):
orders(
@count as order_count,
@sum(total) as monthly_revenue,
@groupBy(yearmonth(created_at)),
@fillGaps(yearmonth(created_at), from: "2024-01", to: "2024-12")
) { }
Když @groupBy obsahuje více polí, každá kombinace ostatních polí nalezených v datech získává všechna období. @fillGaps se může odkazovat na název uvedený pomocí as:
journalEntries(
@groupBy(yearmonth(accountingDate) as period, debitAccountCode),
@sum(amount) as amount,
@fillGaps(period, from: "2026-01", to: "2026-12")
) { }
Složitý dotaz
Kombinace více funkcí v jednom dotazu [badge:Pokročilé|info|right]
orders(limit: 10) {
id
total
user {
id
name
}
items {
id
quantity
product {
id
name
price
}
}
}
Přeložitelná pole
Dotazování vícejazyčných polí s výběrem specifickým pro jazyk [badge:Pokročilé|info|right]
products(limit: 10) {
id
code
name // Returns {"en": "English", "cs": "Czech"}
name:cs // Returns Czech translation only
name:en // Returns English translation only
description:cs as czech_desc
category {
name:cs
name:en
}
}
Dotaz na historická data
Dotazování historických verzí z archivních tabulek v kombinaci s aktuálním řádkem [badge:Pokročilé|info|right]
products(
@history
where: "id = 123"
) {
id
name
price
_deleted
_deletedAt
_archiveValidSince
_archiveValidTo
}
Dotaz na historii k určitému okamžiku
Dotazování dat, jak existovala v konkrétním časovém razítku, plus aktuální řádek [badge:Pokročilé|info|right]
products(
@history(from: "2025-01-01T00:00:00")
where: "price > 100"
limit: 10
) {
id
name
price
_archiveValidSince
_archiveValidTo
}
Pravidla syntaxe
| Syntax | Popis | Příklad |
|---|---|---|
entity(params) { fields } |
Výběr entity — zadejte název entity následovaný volitelnými parametry v závorkách | products(where: "active = true") |
{ id, name } nebo { * } |
Výběr polí — uveďte pole ve složených závorkách, použijte * pro všechna pole |
{ id, name, price } nebo { * } |
lower(), upper(), year(), startOfYear(), isnull(), atd. |
Funkce polí — aplikujte funkce na pole: lower(), upper(), length(), year(), month(), startOfYear(), endOfMonth(), isnull(), atd. | lower(name) as name_lower, startOfYear(created_at) |
where, limit, offset, orderBy, id |
Parametry — použijte parametry where, limit, offset, orderBy a id. Výchozí limit je 1000 řádků. Pro neomezené výsledky použijte limit: 0. | where: "status = 'active'", limit: 10 |
relation { fields } |
Relace — vnořte související entity s vlastním výběrem polí | category { id, name } |
@count, @sum(field), @avg(field) |
Agregace — použijte předponu @ pro agregační funkce |
@count, @sum(price), @avg(rating) |
@fillGaps(field) nebo @fillGaps(field, from: x, to: y) |
Doplnění mezer — doplňte chybějící období ve seskupených výsledcích časových řad (použijte s @groupBy). Automaticky detekuje rozsah nebo přijímá explicitní hranice from/to |
@fillGaps(yearmonth(createdAt)) nebo @fillGaps(month, from: 1, to: 12) |
@groupBy(function(field) as name, ...) |
Pojmenované seskupení — pojmenujte funkci v @groupBy pomocí as; výsledný sloupec získá tento název a @fillGaps(name) se na něj může odkazovat |
@groupBy(yearquarter(date) as period, account) |
[field@asc], [field@desc] |
Řazení — pole dvojic field@direction pro řazení | [created_at@desc, name@asc] |
field as alias |
Aliases — použijte klíčové slovo “as” pro přejmenování polí nebo relací | category as product_category |
name:cs, description:en |
Přeložitelná pole — vyberte specifické jazykové varianty pomocí syntaxe fieldName:languageCode | name:cs, description:en (podporované: cs, en, de, sk, pl, hu, fr, es) |
@history nebo @history(from: "date") |
Historické dotazy — použijte direktivu @history pro dotazování historických dat z archivních tabulek v kombinaci s aktuálním řádkem. Volitelně zadejte časový bod s parametrem from | @history nebo @history(from: "2025-01-01T00:00:00") |
Funkce polí
Transformujte a analyzujte hodnoty polí přímo ve svých dotazech
Funkce polí vám umožňují aplikovat transformace a kontroly na pole v klauzuli select. Funkce lze použít samostatně nebo s aliasy pomocí klíčového slova as.
Řetězcové funkce
| Funkce | Popis | Příklad |
|---|---|---|
lower(field) |
Převede řetězec na malá písmena | lower(name) |
upper(field) |
Převede řetězec na velká písmena | upper(code) |
length(field) |
Získá délku řetězcového pole | length(description) |
isnull(field) |
Zkontroluje, zda je pole NULL | isnull(email) |
Funkce pro datum a čas
| Funkce | Popis | Příklad |
|---|---|---|
year(field) |
Extrahovat rok z data/data a času | year(created_at) |
month(field) |
Extrahovat měsíc z data/data a času | month(birth_date) |
day(field) |
Extrahovat den z data/data a času | day(due_date) |
week(field) |
Extrahovat číslo týdne z data | week(created_at) |
quarter(field) |
Extrahovat čtvrtletí z data (1-4) | quarter(order_date) |
dayofweek(field) |
Extrahovat den v týdnu (0-6, neděle=0) | dayofweek(event_date) |
yearmonth(field) |
Získat řetězec rok-měsíc (RRRR-MM) | yearmonth(created_at) |
yearmonthday(field) |
Získat řetězec rok-měsíc-den (RRRR-MM-DD) | yearmonthday(created_at) |
yearweek(field) |
Získat řetězec rok-týden (RRRR-TT) | yearweek(start_date) |
yearquarter(field) |
Získat řetězec rok-čtvrtletí (RRRR-ČN) | yearquarter(fiscal_date) |
yearhalf(field) |
Získat řetězec rok-pololetí (RRRR-PN) | yearhalf(fiscal_date) |
Funkce pro rozsahy dat
| Funkce | Popis | Příklad |
|---|---|---|
startOfYear(field) |
Získat začátek roku (RRRR-01-01 00:00:00) | startOfYear(created_at) |
endOfYear(field) |
Získat konec roku (RRRR-12-31 23:59:59.999) | endOfYear(created_at) |
startOfMonth(field) |
Získat začátek měsíce (RRRR-MM-01 00:00:00) | startOfMonth(created_at) |
endOfMonth(field) |
Získat konec měsíce (RRRR-MM-31 23:59:59.999) | endOfMonth(created_at) |
startOfDay(field) |
Získat začátek dne (RRRR-MM-DD 00:00:00) | startOfDay(created_at) |
endOfDay(field) |
Získat konec dne (RRRR-MM-DD 23:59:59.999) | endOfDay(created_at) |
startOfHour(field) |
Získat začátek hodiny (RRRR-MM-DD HH:00:00) | startOfHour(created_at) |
endOfHour(field) |
Získat konec hodiny (RRRR-MM-DD HH:59:59.999) | endOfHour(created_at) |
Příklady použití
Funkce pro transformaci řetězců:
users() {
name,
lower(name) as name_lower,
upper(code) as code_upper,
length(description) as desc_length
}
Funkce pro extrakci data/času:
orders() {
id,
order_date,
year(order_date) as order_year,
month(order_date) as order_month,
dayofweek(order_date) as weekday
}
Použití smíšených funkcí:
products() {
name,
isnull(description) as has_no_description,
length(name) as name_length,
yearmonth(created_at) as creation_month
}
Funkce pro rozsahy dat pro analýzu časových období:
analytics() {
id,
event_date,
startOfYear(event_date) as year_start,
endOfYear(event_date) as year_end,
startOfMonth(event_date) as month_start,
endOfMonth(event_date) as month_end,
startOfDay(event_date) as day_start,
endOfDay(event_date) as day_end,
startOfHour(event_date) as hour_start,
endOfHour(event_date) as hour_end
}
Funkce v agregacích GROUP BY:
orders(
@count as order_count,
@sum(total) as total_revenue,
@groupBy(year(created_at), month(created_at))
) { * }
// Date range functions in GROUP BY
events(
@count as event_count,
@sum(value) as total_value,
@groupBy(startOfYear(event_date), startOfMonth(event_date))
) { * }
**Poznámky**
- Funkce lze aliasovat pomocí klíčového slova `as`
- Všechny názvy funkcí nerozlišují velká a malá písmena
- Řetězcové funkce fungují s jakýmkoli polem, které lze převést na řetězec
- Funkce pro datum/čas fungují s typy polí DATE a DATETIME
- Funkce pro rozsahy dat vracejí přesná časová razítka pomocí operací DATE_TRUNC a INTERVAL v PostgreSQL
- Funkce lze použít jak ve výběru polí, tak v agregacích @groupBy
- `dayofweek()` vrací 0-6, kde 0=neděle, 6=sobota
- `quarter()` vrací 1-4 pro Q1-Q4
- `yearmonth()` vrací formát 'RRRR-MM' (např. '2023-12')
- `yearweek()` vrací formát 'RRRR-TT' (např. '2023-52')
- `yearquarter()` vrací formát 'RRRR-ČN' (např. '2023-Q4')
- `yearhalf()` vrací formát 'RRRR-PN' (např. '2023-P2')
- Funkce pro rozsahy dat poskytují přesnost na mikrosekundy pro přesné hranice časových období
Pokročilé funkce
Funkce polí
Aplikujte transformace a kontroly přímo v dotazech
lower(name), year(created_at), length(description)
Dotazy s více ID
Načítání podle jednoho nebo více ID pomocí polí a smíšených typů
products(id: ['id1', "uuid", 123]) { * }
Hluboké vnořování
Přístup k hluboce vnořeným relacím bez dopadu na výkon
orders { user { profile { preferences } } }
Podpora komentářů
Přidejte komentáře k dotazům pro dokumentaci
// Single line comment
/* Multi-line comment */
products(limit: 10) {
id
name // inline comment
}
Přeložitelná pole
Přeložitelná (vícejazyčná) pole lze dotazovat několika způsoby:
Bez jazykové přípony:
products { name, description }
Vrací všechny vyplněné jazyky jako objekt JSON: {"en": "English", "cs": "Czech"}
S jazykovou příponou:
products {
name:cs, // Czech only
name:en, // English only
name:de // German only
}
Vrací pouze konkrétní jazyk jako řetězec. Podporuje: cs, en, de, sk, pl, hu, fr, es
S aliasy:
products {
name:cs as czech_name,
name:en as english_name
}
Použijte aliasy k přejmenování polí s jazykovými příponami
**Výběr jazyka:**
- Jazyk se vybírá pomocí HTTP hlavičky Accept-Language.
- Všechna přeložitelná pole ve výsledcích dotazu ve výchozím nastavení vracejí všechny vyplněné jazyky (bez jazykové přípony).
- Použijte syntaxi fieldName:languageCode pro získání pouze konkrétního jazyka.
- Jazyková přípona funguje jak ve filtrech WHERE, tak v polích SELECT.
- Pokud požadovaný jazyk není k dispozici, pole může být prázdné nebo null.
- Příklad: `Accept-Language: en-US, cs-CZ;q=0.9`
Vyhledávání a externí ID
Entity můžete odkazovat pomocí vyhledávacích identifikátorů namísto číselných/UUID ID. To je obzvláště užitečné při práci s daty z externích systémů, jako je ABRA Flexi/FlexiBee.
Standardní vyhledávání
Použijte identifikátory založené na polích, jako jsou code:, ean: nebo guid:
Použití vyhledávání podle kódu:
products(id: "code:ABC123") { id, name, code }
Použití vyhledávání v klauzuli WHERE:
products(where: "category = 'code:ELEC'") { id, name }
Více ID s vyhledáváním:
products(id: ["code:ABC", "ean:123456", "uuid-value"]) { * }
Vyhledávání externích ID
Externí ID (ext:) vám umožňují odkazovat na entity pomocí identifikátorů z externích systémů. Tato ID jsou uložena ve vyhrazené tabulce extIds a podporují vícedílné klíče s dvojtečkami.
Použití externího ID v dotazu:
products(id: "ext:SYSTEM:PRODUCT:12345") { id, name, code }
Použití externího ID v klauzuli WHERE:
products(where: "category = 'ext:SYSTEM:CATEGORY:ELEC'") { id, name }
Smíšené identifikátory (standardní + externí):
products(id: ["code:ABC", "ext:SYSTEM:PRODUCT:789"]) { * }
Externí ID v relačních polích:
orders(where: "customer = 'ext:CRM:CUSTOMER:C001'") {
id
customer {
id
name
}
}
Vícedílná externí ID (s dvojtečkami):
products(id: "ext:SYSTEM:NAMESPACE:TYPE:ID:123") { id, name }
- Externí ID jsou automaticky vytvářena při importu dat s identifikátory `ext:`
- Stejná entita může mít více externích ID z různých systémů
- Externí ID fungují všude tam, kde fungují běžná ID (dotazy, klauzule WHERE, relační pole)
- Vše za `ext:` je považováno za externí identifikátor
- Externí ID nerozlišují velká a malá písmena při porovnávání
- Uloženo ve vyhrazené tabulce `extIds` s poli: code, related_id, related_entity
Koncový bod API: /api/query
Koncový bod /api/query přijímá požadavky POST s poli dotazů a vrací streamované odpovědi JSON pro optimální výkon. Více dotazů je zpracováváno paralelně a výsledky jsou odesílány, jakmile jsou k dispozici.
Požadované hlavičky
| Záhlaví | Popis |
|---|---|
Authorization |
Bearer token pro ověřování (např. Bearer your-jwt-token) |
x-organisation-id |
Identifikátor organizace pro vymezení kontextu dotazu |
x-archive-at |
Volitelné časové razítko pro dotazy k určitému časovému bodu. |
x-changeset-id |
Volitelné ID sady změn pro dotazování konkrétních verzí dat. |
Accept-Language |
Jazyková preference pro přeložitelná pole (např. en-US, cs-CZ) |
[navigate:/apiKeys|Spravovat klíče API|key]
Formát požadavku
POST /api/query
Content-Type: application/json
[
{
"requestId": "products",
"query": "products(where: \"category.name = ${categoryName}\", limit: 5) { id, name, price }",
"params": {"categoryName": "Electronics"}
},
{
"requestId": "categories",
"query": "categories { id, name }",
"params": {}
}
]
Úspěšná odpověď
[
{
"requestId": "products",
"success": true,
"data": [
{"id": 1, "name": "Product 1", "price": 100},
{"id": 2, "name": "Product 2", "price": 150}
]
}
]
Chybová odpověď
[
{
"requestId": "products",
"success": false,
"error": "Invalid where clause syntax",
"errorCode": "QUERY_ERROR"
}
]
Odpovědi jsou streamovány po částech pro optimální výkon. Více dotazů je zpracováváno paralelně a výsledky mohou dorazit v jiném pořadí, než bylo požadováno. Při zpracování streamu odpovědi použijte částečný JSON parser, který dokáže zpracovat neúplný JSON.
Vyplňování mezer pro časové řady (@fillGaps)
Vyplňte chybějící období ve skupinových výsledcích pro plynulé, nepřerušované grafy
Při vytváření grafů nebo sestav v průběhu času mají seskupené výsledky často mezery – měsíce, týdny nebo roky, pro které neexistují žádná data. @fillGaps automaticky vkládá řádky pro tyto chybějící hodnoty, takže výsledná sada je souvislá.
Použijte @fillGaps společně s @groupBy na stejném poli. Spouští se jako krok po zpracování a nemění vaše data.
Jak to funguje
- Chybějící intervaly jsou detekovány porovnáním hodnot seskupených polí s očekávaným rozsahem.
- Automatická detekce rozsahu: ve výchozím nastavení se rozsah rozprostírá od nejmenší po největší hodnotu ve skutečných datech.
- Explicitní rozsah: použijte
froma/nebotok rozšíření rozsahu nad rámec toho, co data obsahují. - Několik seskupených polí: mezery jsou vyplněny pro každou kombinaci ostatních seskupených polí, která se vyskytuje v datech.
- Pojmenovaná pole:
@fillGapsmůže odkazovat na funkci pojmenovanou pomocíasv@groupBy, např.@fillGaps(period). - Agregace
@counta@sumjsou pro chybějící řádky vyplněny0. - Agregace
@avg,@min,@maxjsou pro chybějící řádky vyplněnynull.
Podporované typy polí
| Pole | Formát | Příklad |
|---|---|---|
yearmonth(field) |
řetězce YYYY-MM |
"2024-01" … "2024-12" |
yearmonthday(field) |
řetězce YYYY-MM-DD |
"2024-01-01" … "2024-01-31" |
yearweek(field) |
řetězce YYYY-WW |
"2024-01" … "2024-52" |
yearquarter(field) |
řetězce YYYY-QN |
"2024-Q1" … "2024-Q4" |
yearhalf(field) |
řetězce YYYY-HN |
"2024-H1", "2024-H2" |
year(field) |
celé číslo roku | 2022 … 2024 |
month(field) |
celé číslo 1–12 | 1 … 12 |
day(field), week(field), quarter(field), dayofweek(field) |
celá čísla | |
| obyčejné celočíselné pole | libovolné celé číslo | @groupBy(month), @fillGaps(month) |
Měsíční trend s automaticky detekovaným rozsahem
orders(
@count as order_count,
@sum(total) as monthly_revenue,
@groupBy(yearmonth(created_at)),
@fillGaps(yearmonth(created_at))
) { }
Měsíce bez objednávek získají order_count=0 a monthly_revenue=0
Celoroční dashboard (explicitní rozsah)
orders(
@count as order_count,
@avg(total) as avg_order_value,
@groupBy(yearmonth(created_at)),
@fillGaps(yearmonth(created_at), from: "2024-01", to: "2024-12")
) { }
Vždy vrátí přesně 12 řádků, leden–prosinec 2024
Týdenní aktivita s nulovými metrikami pro prázdné týdny
events(
@count as event_count,
@avg(duration) as avg_duration,
@groupBy(yearweek(event_date)),
@fillGaps(yearweek(event_date))
) { }
Prázdné týdny získají event_count=0 a avg_duration=null
Seskupování celočíselného pole
products(
@count as product_count,
@groupBy(month),
@fillGaps(month, from: 1, to: 12)
) { }
- `@fillGaps` musí být použito společně s `@groupBy` na stejném poli
- Automatická detekce vyplňuje od minimální po maximální hodnotu přítomnou v datech
- Můžete zadat pouze `from`, pouze `to`, nebo obojí pro jemné ovládání
- Číselné hodnoty `from`/`to` se píší bez uvozovek; řetězcové hodnoty (yearmonth, yearweek) používají dvojité uvozovky
- Direktiva ovlivňuje pouze výslednou sadu; nemění data ani nespouští další SQL dotazy
Dotazy historie (@history)
Dotazování historických dat z archivních tabulek v kombinaci s aktuálním řádkem
Direktiva @history umožňuje dotazovat se na historická data z archivních tabulek. Pokud entity podporují archivaci, všechny změny záznamů jsou uchovávány ve speciálních archivních tabulkách, které udržují kompletní historii úprav a smazání. Dotaz vrací jak historické verze, tak aktuální stav záznamů.
Jak to funguje
Direktiva @history používá SQL UNION ALL ke kombinování:
- Řádky archivní tabulky — historické verze z
{entity}_archive - Aktuální řádek tabulky — aktuální stav z
{entity}
Výsledky jsou seřazeny podle _archiveValidTo DESC NULLS LAST, což znamená, že historické verze se zobrazují nejprve (od nejnovější po nejstarší) a aktuální řádek se zobrazuje jako poslední.
Pole specifická pro archiv
| Pole | Typ | Popis |
|---|---|---|
_deleted |
Boolean | Zda byl záznam smazán (true) nebo upraven (false). Pro aktuální řádek vždy false. |
_deletedAt |
DateTime | Časové razítko, kdy byl záznam smazán (null, pokud nebyl smazán nebo se jedná o aktuální řádek). |
_archiveValidSince |
DateTime | Začátek období, kdy byla tato verze platná. NOW() pro aktuální řádek. |
_archiveValidTo |
DateTime | Konec období, kdy byla tato verze platná. NULL pro aktuální řádek. |
Dotaz na všechny historické verze plus aktuální řádek
products(@history) {
id
name
price
_deleted
_deletedAt
_archiveValidSince
_archiveValidTo
}
Dotaz k určitému časovému bodu (data k určitému datu)
products(
@history(from: "2025-01-01T00:00:00")
where: "price > 100"
) {
id
name
price
_archiveValidSince
_archiveValidTo
}
Najít všechny změny konkrétního produktu
products(
@history
where: "id = 123"
) {
id
name
price
_archiveValidSince
_archiveValidTo
}
Najít smazané záznamy
products(
@history
where: "_deleted = true"
) {
id
name
_deletedAt
_archiveValidSince
_archiveValidTo
}
Běžné případy použití
card: Auditní záznamy
Sledujte všechny změny citlivých dat pro dodržení souladu
card: Cestování časem
Zobrazte data tak, jak existovala v kterémkoli okamžiku v minulosti
card: Analýza změn
Analyzujte vzorce v úpravách dat v průběhu času
card: Obnova smazaných záznamů
Najděte a zkontrolujte smazané záznamy vedle aktuálních záznamů
- Ne všechny entity podporují archivaci. Pokud použijete @history na nepodporované entitě, obdržíte chybu
- Dotaz vždy zahrnuje aktuální stav záznamů jako poslední řádek (řádky) ve výsledné sadě
- Archivní tabulky mohou obsahovat mnoho verzí, proto používejte vhodné klauzule where a parametry limit
- Časová razítka by měla být poskytnuta ve formátu ISO 8601 (např. „2025-01-01T12:00:00“)
- Pro aktuální řádek je _archiveValidTo NULL a _deleted je vždy false
Filtrování pomocí klauzulí WHERE
Parametr where používá náš výkonný systém filtrů, který podporuje různé operátory, logické podmínky a filtrování vztahů. Přečtěte si o všech dostupných operátorech a podívejte se na praktické příklady.
products(where: "price > 100 and category.name = 'Electronics'") { id, name, price }
[navigate:where.md|Zobrazit dokumentaci klauzule WHERE|filter]
Komplexní průvodce možnostmi filtrování a vyhledávání
Výkon a osvědčené postupy
card: Eliminace problému N+1
Systém automaticky dávkuje a optimalizuje vnořené dotazy, aby zabránil problémům N+1 SQL
card: Selektivní načítání polí
Vyžádejte si pouze pole, která potřebujete, abyste minimalizovali přenos a zpracování dat
card: Použijte stránkování
Pro velké datové sady vždy používejte limit a offset pro zlepšení doby odezvy. Výchozí limit je 1000 řádků – pro neomezené výsledky použijte limit: 0 (používejte s opatrností).
card: Streamování výsledků
Více dotazů může vracet výsledky v optimalizovaném pořadí pro lepší propustnost