Čo je to?
Poznámka pre administrátora: Toto je výkonný nástroj na získavanie dát, ktorý sa používa na získavanie, filtrovanie a sumarizáciu informácií z vášho e-shopu. Predstavte si ho ako spôsob, ako „klásť otázky“ o vašich dátach, aby ste získali presne tie odpovede, ktoré potrebujete.
Pre koho je to určené? Administrátor by si to mal prečítať, aby pochopil možnosti analýzy dát systému. Konkrétne pokyny a príklady kódu sú však určené pre vývojárov na implementáciu vo vašich integráciách alebo vlastných reportoch.
Kľúčové výhody pre e-shop:
- Flexibilné reportovanie: Získajte presne tie dáta, ktoré potrebujete pre vlastné tabuľky alebo dashboardy, bez zbytočného „šumu“.
- Analýza trendov: Automaticky zoskupujte údaje o predaji alebo produktoch podľa časových období, aby ste videli, ako vaše podnikanie rastie.
- Cestovanie v čase: Pozrite si, ako presne vyzerali vaše dáta v ktoromkoľvek bode v minulosti, aby ste vyriešili nezrovnalosti alebo skontrolovali zmeny.
- Inteligentné dopĺňanie dát: Zabezpečte, aby vaše grafy vyzerali profesionálne, automatickým dopĺňaním „medzier“ v dňoch, keď nedošlo k žiadnym predajom.
Prehľad
Náš dotazovací jazyk je inšpirovaný GraphQL, ale je navrhnutý pre SQL-založené backendy a adaptáciu REST API. Používa známu, vnorenú a expresívnu syntax, ktorá eliminuje problém N+1 prostredníctvom inteligentného dávkovania a optimalizácie dotazov.
card: Inšpirované GraphQL
Známa vnorená syntax s výberom entít, špecifikáciou polí a podporou parametrov
card: Kompatibilné s REST
Dokáže prekladať dotazy na REST koncové body pre kompatibilitu s existujúcimi službami
card: Optimalizované pre výkon
Eliminuje problémy N+1 SQL prostredníctvom automatického dávkovania a optimalizácie dotazov
Príklady dotazov
Základný dotaz
Získajte všetky polia z entity [badge:Basic|info|right]
products {
id
name
price
description
}
Dotaz s parametrami
Použite parametre pre filtrovanie a stránkovanie [badge:Parameters|info|right]
products(
where: "status = 'active'",
limit: 10,
orderBy: [name@asc]
) {
id
name
price
}
Vnorené vzťahy
Získajte súvisiace entity v jednom dotaze [badge:Relations|info|right]
products {
id
name
category {
id
name
}
variants(limit: 10) {
id
price
}
}
Dotaz s agregáciami
Zahrňte agregačné funkcie do vášho dotazu [badge:Aggregation|info|right]
products(
where: "price > 100"
) {
id
name
@count as total_products
@sum(price) as total_price
}
Funkcie polí
Aplikujte funkcie na polia pre transformácie [badge:Functions|info|right]
categories() {
name,
length(name) as name_length,
isnull(description) as has_no_description,
upper(code) as code_upper
}
Funkcie dátumu
Extrahujte komponenty dátumu/času z polí [badge:Functions|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
}
Funkcie rozsahu dátumov
Získajte presné hranice časového obdobia pre analýzy [badge:Functions|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 funkciami
Použite funkcie v zoskupovaní agregácií [badge:Aggregation|info|right]
sales(
@count as total_sales,
@sum(amount) as total_revenue,
@groupBy(year(sale_date), month(sale_date))
) { * }
Pomenujte zoskupenú funkciu s as, aby ste získali predvídateľný stĺpec vo výsledku, a skombinujte obdobie s iným poľom:
journalEntries(
where: "isPosted = true",
@groupBy(yearquarter(accountingDate) as period, debitAccountCode),
@sum(amount) as amount
) { }
Každý riadok výsledku má period (napr. 2026-Q1), debitAccountCode a amount.
Dopĺňanie medzier pre grafy časových radov
Vyplňte chýbajúce obdobia vo zoskupených výsledkoch pre súvislé grafy [badge:Aggregation|info|right]
orders(
@count as order_count,
@sum(total) as monthly_revenue,
@groupBy(yearmonth(created_at)),
@fillGaps(yearmonth(created_at))
) { }
S explicitným rozsahom dátumov (rozšírenie za hranice dát):
orders(
@count as order_count,
@sum(total) as monthly_revenue,
@groupBy(yearmonth(created_at)),
@fillGaps(yearmonth(created_at), from: "2024-01", to: "2024-12")
) { }
Keď @groupBy má viac polí, každá kombinácia ostatných polí nájdených v dátach získa všetky obdobia. @fillGaps sa môže odkazovať na názov zadaný s as:
journalEntries(
@groupBy(yearmonth(accountingDate) as period, debitAccountCode),
@sum(amount) as amount,
@fillGaps(period, from: "2026-01", to: "2026-12")
) { }
Komplexný dotaz
Skombinujte viacero funkcií v jednom dotaze [badge:Advanced|info|right]
orders(limit: 10) {
id
total
user {
id
name
}
items {
id
quantity
product {
id
name
price
}
}
}
Preložiteľné polia
Dotazujte sa na viacjazyčné polia s výberom špecifickým pre jazyk [badge:Advanced|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é dáta
Dotazujte sa na historické verzie z archívnych tabuliek v kombinácii s aktuálnym riadkom [badge:Advanced|info|right]
products(
@history
where: "id = 123"
) {
id
name
price
_deleted
_deletedAt
_archiveValidSince
_archiveValidTo
}
Dotaz na históriu k určitému časovému bodu
Dotazujte sa na dáta, ako existovali v konkrétnom časovom bode, plus aktuálny riadok [badge:Advanced|info|right]
products(
@history(from: "2025-01-01T00:00:00")
where: "price > 100"
limit: 10
) {
id
name
price
_archiveValidSince
_archiveValidTo
}
Pravidlá syntaxe
| Syntax | Popis | Príklad |
|---|---|---|
entity(params) { fields } |
Výber entity — zadajte názov entity, za ktorým nasledujú voliteľné parametre v zátvorkách | products(where: "active = true") |
{ id, name } alebo { * } |
Výber polí — zoznam polí v zložených zátvorkách, použite * pre všetky polia |
{ id, name, price } alebo { * } |
lower(), upper(), year(), startOfYear(), isnull(), atď. |
Funkcie polí — aplikujte funkcie na polia: lower(), upper(), length(), year(), month(), startOfYear(), endOfMonth(), isnull(), atď. | lower(name) as name_lower, startOfYear(created_at) |
where, limit, offset, orderBy, id |
Parametre — použite parametre where, limit, offset, orderBy a id. Predvolený limit je 1000 riadkov. Použite limit: 0 pre neobmedzené výsledky. | where: "status = 'active'", limit: 10 |
relation { fields } |
Vzťahy — vnorte súvisiace entity s vlastným výberom polí | category { id, name } |
@count, @sum(field), @avg(field) |
Agregácie — použite predponu @ pre agregačné funkcie |
@count, @sum(price), @avg(rating) |
@fillGaps(field) alebo @fillGaps(field, from: x, to: y) |
Dopĺňanie medzier — vyplňte chýbajúce obdobia vo zoskupených výsledkoch časových radov (použite s @groupBy). Automaticky detekuje rozsah alebo akceptuje explicitné hranice from/to |
@fillGaps(yearmonth(createdAt)) alebo @fillGaps(month, from: 1, to: 12) |
@groupBy(function(field) as name, ...) |
Pomenované zoskupenie — pomenujte funkciu v @groupBy s as; stĺpec výsledku získa tento názov a @fillGaps(name) sa naň môže odkazovať |
@groupBy(yearquarter(date) as period, account) |
[field@asc], [field@desc] |
Zoradenie — pole párov field@direction pre zoradenie | [created_at@desc, name@asc] |
field as alias |
Aliasy — použite kľúčové slovo “as” na premenovanie polí alebo vzťahov | category as product_category |
name:cs, description:en |
Preložiteľné polia — vyberte konkrétne jazykové varianty pomocou syntaxe fieldName:languageCode | name:cs, description:en (podporované: cs, en, de, sk, pl, hu, fr, es) |
@history alebo @history(from: "date") |
Historické dotazy — použite direktívu @history na dotazovanie historických dát z archívnych tabuliek v kombinácii s aktuálnym riadkom. Voliteľne zadajte časový bod pomocou parametra from | @history alebo @history(from: "2025-01-01T00:00:00") |
Funkcie polí
Transformujte a analyzujte hodnoty polí priamo vo vašich dotazoch
Funkcie polí vám umožňujú aplikovať transformácie a kontroly na polia v klauzule select. Funkcie môžu byť použité samostatne alebo s aliasmi pomocou kľúčového slova as.
Reťazcové funkcie
| Funkcia | Popis | Príklad |
|---|---|---|
lower(field) |
Prevedie reťazec na malé písmená | lower(name) |
upper(field) |
Prevedie reťazec na veľké písmená | upper(code) |
length(field) |
Získa dĺžku reťazcového poľa | length(description) |
isnull(field) |
Skontroluje, či je pole NULL | isnull(email) |
Funkcie dátumu a času
| Funkcia | Popis | Príklad |
|---|---|---|
year(field) |
Extrahovať rok z dátumu/dátumu a času | year(created_at) |
month(field) |
Extrahovať mesiac z dátumu/dátumu a času | month(birth_date) |
day(field) |
Extrahovať deň z dátumu/dátumu a času | day(due_date) |
week(field) |
Extrahovať číslo týždňa z dátumu | week(created_at) |
quarter(field) |
Extrahovať štvrťrok z dátumu (1-4) | quarter(order_date) |
dayofweek(field) |
Extrahovať deň v týždni (0-6, Nedeľa=0) | dayofweek(event_date) |
yearmonth(field) |
Získať reťazec rok-mesiac (RRRR-MM) | yearmonth(created_at) |
yearmonthday(field) |
Získať reťazec rok-mesiac-deň (RRRR-MM-DD) | yearmonthday(created_at) |
yearweek(field) |
Získať reťazec rok-týždeň (RRRR-TT) | yearweek(start_date) |
yearquarter(field) |
Získať reťazec rok-štvrťrok (RRRR-ŠN) | yearquarter(fiscal_date) |
yearhalf(field) |
Získať reťazec rok-polrok (RRRR-PN) | yearhalf(fiscal_date) |
Funkcie rozsahu dátumov
| Funkcia | Popis | Príklad |
|---|---|---|
startOfYear(field) |
Získať začiatok roka (RRRR-01-01 00:00:00) | startOfYear(created_at) |
endOfYear(field) |
Získať koniec roka (RRRR-12-31 23:59:59.999) | endOfYear(created_at) |
startOfMonth(field) |
Získať začiatok mesiaca (RRRR-MM-01 00:00:00) | startOfMonth(created_at) |
endOfMonth(field) |
Získať koniec mesiaca (RRRR-MM-31 23:59:59.999) | endOfMonth(created_at) |
startOfDay(field) |
Získať začiatok dňa (RRRR-MM-DD 00:00:00) | startOfDay(created_at) |
endOfDay(field) |
Získať koniec dňa (RRRR-MM-DD 23:59:59.999) | endOfDay(created_at) |
startOfHour(field) |
Získať začiatok hodiny (RRRR-MM-DD HH:00:00) | startOfHour(created_at) |
endOfHour(field) |
Získať koniec hodiny (RRRR-MM-DD HH:59:59.999) | endOfHour(created_at) |
Príklady použitia
Funkcie transformácie reťazcov:
users() {
name,
lower(name) as name_lower,
upper(code) as code_upper,
length(description) as desc_length
}
Funkcie extrakcie dátumu/času:
orders() {
id,
order_date,
year(order_date) as order_year,
month(order_date) as order_month,
dayofweek(order_date) as weekday
}
Použitie zmiešaných funkcií:
products() {
name,
isnull(description) as has_no_description,
length(name) as name_length,
yearmonth(created_at) as creation_month
}
Funkcie rozsahu dátumov pre analýzu časového obdobia:
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
}
Funkcie v agregáciá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**
- Funkcie môžu byť aliasované pomocou kľúčového slova `as`
- Všetky názvy funkcií nerozlišujú veľké a malé písmená
- Reťazcové funkcie fungujú s akýmkoľvek poľom, ktoré možno previesť na reťazec
- Funkcie dátumu/času fungujú s typmi polí DATE a DATETIME
- Funkcie rozsahu dátumov vracajú presné časové pečiatky pomocou operácií DATE_TRUNC a INTERVAL v PostgreSQL
- Funkcie možno použiť pri výbere polí aj v agregáciách @groupBy
- `dayofweek()` vracia 0-6, kde 0=Nedeľa, 6=Sobota
- `quarter()` vracia 1-4 pre Q1-Q4
- `yearmonth()` vracia formát 'RRRR-MM' (napr. '2023-12')
- `yearweek()` vracia formát 'RRRR-TT' (napr. '2023-52')
- `yearquarter()` vracia formát 'RRRR-ŠN' (napr. '2023-Q4')
- `yearhalf()` vracia formát 'RRRR-PN' (napr. '2023-H2')
- Funkcie rozsahu dátumov poskytujú presnosť mikrosekúnd pre presné hranice časového obdobia
Pokročilé funkcie
Funkcie polí
Aplikujte transformácie a kontroly priamo v dotazoch
lower(name), year(created_at), length(description)
Dotazy s viacerými ID
Načítanie podľa jedného alebo viacerých ID pomocou polí a zmiešaných typov
products(id: ['id1', "uuid", 123]) { * }
Hlboké vnorenie
Prístup k hlboko vnoreným vzťahom bez penalizácie výkonu
orders { user { profile { preferences } } }
Podpora komentárov
Pridajte komentáre k svojim dotazom pre dokumentáciu
// Single line comment
/* Multi-line comment */
products(limit: 10) {
id
name // inline comment
}
Preložiteľné polia
Preložiteľné (viacjazyčné) polia je možné dotazovať viacerými spôsobmi:
Bez prípony jazyka:
products { name, description }
Vráti všetky vyplnené jazyky ako objekt JSON: {"en": "English", "cs": "Czech"}
S príponou jazyka:
products {
name:cs, // Czech only
name:en, // English only
name:de // German only
}
Vráti iba konkrétny jazyk ako reťazec. Podporuje: cs, en, de, sk, pl, hu, fr, es
S aliasmi:
products {
name:cs as czech_name,
name:en as english_name
}
Použite aliasy na premenovanie polí s príponami jazyka
**Výber jazyka:**
- Jazyk sa vyberá pomocou hlavičky HTTP Accept-Language.
- Všetky preložiteľné polia vo výsledkoch dotazu vracajú predvolene všetky vyplnené jazyky (bez prípony jazyka).
- Použite syntax fieldName:languageCode na získanie iba konkrétneho jazyka.
- Prípona jazyka funguje vo filtroch WHERE aj v poliach SELECT.
- Ak požadovaný jazyk nie je k dispozícii, pole môže byť prázdne alebo null.
- Príklad: `Accept-Language: en-US, cs-CZ;q=0.9`
Vyhľadávania a externé ID
Entity môžete odkazovať pomocou vyhľadávacích identifikátorov namiesto numerických/UUID ID. To je obzvlášť užitočné pri práci s dátami z externých systémov, ako sú ABRA Flexi/FlexiBee.
Štandardné vyhľadávania
Použite identifikátory založené na poliach, ako sú code:, ean:, alebo guid:
Použitie vyhľadávania kódu:
products(id: "code:ABC123") { id, name, code }
Použitie vyhľadávania v klauzule WHERE:
products(where: "category = 'code:ELEC'") { id, name }
Viaceré ID s vyhľadávaním:
products(id: ["code:ABC", "ean:123456", "uuid-value"]) { * }
Vyhľadávania externých ID
Externé ID (ext:) vám umožňujú odkazovať na entity pomocou identifikátorov z externých systémov. Tieto ID sú uložené v špecializovanej tabuľke extIds a podporujú viacdielne kľúče s dvojbodkami.
Použitie externého ID v dotaze:
products(id: "ext:SYSTEM:PRODUCT:12345") { id, name, code }
Použitie externého ID v klauzule WHERE:
products(where: "category = 'ext:SYSTEM:CATEGORY:ELEC'") { id, name }
Zmiešané identifikátory (štandardné + externé):
products(id: ["code:ABC", "ext:SYSTEM:PRODUCT:789"]) { * }
Externé ID v relačných poliach:
orders(where: "customer = 'ext:CRM:CUSTOMER:C001'") {
id
customer {
id
name
}
}
Viacdielne externé ID (s dvojbodkami):
products(id: "ext:SYSTEM:NAMESPACE:TYPE:ID:123") { id, name }
- Externé ID sa automaticky vytvárajú pri importe dát s identifikátormi `ext:`
- Rovnaká entita môže mať viacero externých ID z rôznych systémov
- Externé ID fungujú všade, kde fungujú bežné ID (dotazy, klauzuly WHERE, relačné polia)
- Všetko za `ext:` sa považuje za externý identifikátor
- Externé ID nerozlišujú veľkosť písmen pri porovnávaní
- Uložené v špecializovanej tabuľke `extIds` s poľami: code, related_id, related_entity
Koncový bod API: /api/query
Koncový bod /api/query prijíma požiadavky POST s poľami dotazov a vracia streamované JSON odpovede pre optimálny výkon. Viacero dotazov sa spracováva paralelne a výsledky sa odosielajú hneď, ako sú k dispozícii.
Požadované hlavičky
| Hlavička | Popis |
|---|---|
Authorization |
Bearer token na overenie (napr. Bearer your-jwt-token) |
x-organisation-id |
Identifikátor organizácie na určenie kontextu dotazu |
x-archive-at |
Voliteľná časová pečiatka pre dotazy k určitému časovému bodu. |
x-changeset-id |
Voliteľné ID sady zmien pre dotazovanie konkrétnych verzií dát. |
Accept-Language |
Preferencie jazyka pre preložiteľné polia (napr. en-US, cs-CZ) |
[navigate:/apiKeys|Spravovať kľúče API|key]
Formát požiadavky
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": {}
}
]
Úspešná odpoveď
[
{
"requestId": "products",
"success": true,
"data": [
{"id": 1, "name": "Product 1", "price": 100},
{"id": 2, "name": "Product 2", "price": 150}
]
}
]
Chybová odpoveď
[
{
"requestId": "products",
"success": false,
"error": "Invalid where clause syntax",
"errorCode": "QUERY_ERROR"
}
]
Odpovede sú streamované po častiach pre optimálny výkon. Viacero dotazov sa spracováva paralelne a výsledky môžu prísť v inom poradí, než boli požadované. Pri spracovaní streamu odpovedí použite čiastočný JSON parser, ktorý dokáže spracovať neúplný JSON.
Dopĺňanie medzier pre časové rady (@fillGaps)
Doplňte chýbajúce obdobia v zoskupených výsledkoch pre plynulé, súvislé grafy
Pri vytváraní grafov alebo reportov v priebehu času majú zoskupené výsledky často medzery – mesiace, týždne alebo roky, pre ktoré neexistujú žiadne dáta. @fillGaps automaticky vloží riadky pre tieto chýbajúce hodnoty, aby bola výsledná sada súvislá.
Použite @fillGaps spolu s @groupBy na rovnakom poli. Spúšťa sa ako krok po spracovaní a nemodifikuje vaše dáta.
Ako to funguje
- Chýbajúce intervaly sú detekované porovnaním zoskupených hodnôt poľa s očakávaným rozsahom.
- Automatická detekcia rozsahu: štandardne sa rozsah rozprestiera od najmenšej po najväčšiu hodnotu v aktuálnych dátach.
- Explicitný rozsah: použite
froma/alebotona rozšírenie rozsahu nad rámec toho, čo dáta obsahujú. - Viaceré zoskupené polia: medzery sa vyplnia pre každú kombináciu ostatných zoskupených polí, ktorá sa vyskytuje v dátach.
- Pomenované polia:
@fillGapssa môže odkazovať na funkciu pomenovanú pomocouasv@groupBy, napr.@fillGaps(period). - Agregácie
@counta@sumsú pre chýbajúce riadky vyplnené0. - Agregácie
@avg,@min,@maxsú pre chýbajúce riadky vyplnenénull.
Podporované typy polí
| Pole | Formát | Príklad |
|---|---|---|
yearmonth(field) |
YYYY-MM strings |
"2024-01" … "2024-12" |
yearmonthday(field) |
YYYY-MM-DD strings |
"2024-01-01" … "2024-01-31" |
yearweek(field) |
YYYY-WW strings |
"2024-01" … "2024-52" |
yearquarter(field) |
YYYY-QN strings |
"2024-Q1" … "2024-Q4" |
yearhalf(field) |
YYYY-HN strings |
"2024-H1", "2024-H2" |
year(field) |
integer year | 2022 … 2024 |
month(field) |
integer 1–12 | 1 … 12 |
day(field), week(field), quarter(field), dayofweek(field) |
integers | |
| plain integer field | any integer | @groupBy(month), @fillGaps(month) |
Mesačný trend s automaticky detekovaným rozsahom
orders(
@count as order_count,
@sum(total) as monthly_revenue,
@groupBy(yearmonth(created_at)),
@fillGaps(yearmonth(created_at))
) { }
Mesiace bez objednávok dostanú order_count=0 a monthly_revenue=0
Celoročný prehľad (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áti presne 12 riadkov, január – december 2024
Týždenná aktivita s nulovými metrikami pre prázdne týždne
events(
@count as event_count,
@avg(duration) as avg_duration,
@groupBy(yearweek(event_date)),
@fillGaps(yearweek(event_date))
) { }
Prázdne týždne dostanú event_count=0 a avg_duration=null
Zoskupovanie celočíselných polí
products(
@count as product_count,
@groupBy(month),
@fillGaps(month, from: 1, to: 12)
) { }
- `@fillGaps` sa musí používať spolu s `@groupBy` na rovnakom poli
- Automatická detekcia vyplní od minimálnej po maximálnu hodnotu prítomnú v dátach
- Môžete zadať iba `from`, iba `to` alebo oboje pre podrobné ovládanie
- Číselné hodnoty `from`/`to` sa píšu bez úvodzoviek; reťazcové hodnoty (yearmonth, yearweek) používajú dvojité úvodzovky
- Direktíva ovplyvňuje iba výslednú sadu; nemodifikuje dáta ani nespúšťa ďalšie SQL dotazy
Dotazy histórie (@history)
Dotazovanie historických dát z archívnych tabuliek v kombinácii s aktuálnym riadkom
Direktíva @history vám umožňuje dotazovať historické dáta z archívnych tabuliek. Keď entity podporujú archiváciu, všetky zmeny záznamov sú uchovávané v špeciálnych archívnych tabuľkách, ktoré udržiavajú kompletnú históriu modifikácií a vymazaní. Dotaz vráti historické verzie aj aktuálny stav záznamov.
Ako to funguje
Direktíva @history používa SQL UNION ALL na kombinovanie:
- Riadky archívnej tabuľky — historické verzie z
{entity}_archive - Aktuálny riadok tabuľky — aktuálny stav z
{entity}
Výsledky sú zoradené podľa _archiveValidTo DESC NULLS LAST, čo znamená, že historické verzie sa zobrazujú ako prvé (od najnovších po najstaršie) a aktuálny riadok sa zobrazuje ako posledný.
Polia špecifické pre archív
| Pole | Typ | Popis |
|---|---|---|
_deleted |
Boolean | Či bol záznam vymazaný (true) alebo modifikovaný (false). Pre aktuálny riadok vždy false. |
_deletedAt |
DateTime | Časová pečiatka, kedy bol záznam vymazaný (null, ak nebol vymazaný alebo ide o aktuálny riadok) |
_archiveValidSince |
DateTime | Začiatok obdobia, kedy bola táto verzia platná. NOW() pre aktuálny riadok. |
_archiveValidTo |
DateTime | Koniec obdobia, kedy bola táto verzia platná. NULL pre aktuálny riadok. |
Dotazovanie všetkých historických verzií plus aktuálny riadok
products(@history) {
id
name
price
_deleted
_deletedAt
_archiveValidSince
_archiveValidTo
}
Dotaz k určitému časovému bodu (dáta k špecifickému dátumu)
products(
@history(from: "2025-01-01T00:00:00")
where: "price > 100"
) {
id
name
price
_archiveValidSince
_archiveValidTo
}
Nájsť všetky zmeny konkrétneho produktu
products(
@history
where: "id = 123"
) {
id
name
price
_archiveValidSince
_archiveValidTo
}
Nájsť vymazané záznamy
products(
@history
where: "_deleted = true"
) {
id
name
_deletedAt
_archiveValidSince
_archiveValidTo
}
Bežné prípady použitia
card: Auditná stopa
Sledujte všetky zmeny citlivých dát pre dodržiavanie súladu
card: Cestovanie v čase
Zobrazte dáta tak, ako existovali v ktoromkoľvek bode v minulosti
card: Analýza zmien
Analyzujte vzory v modifikáciách dát v priebehu času
card: Obnova vymazaných záznamov
Nájdite a skontrolujte vymazané záznamy spolu s aktuálnymi záznamami
- Nie všetky entity podporujú archiváciu. Ak použijete @history na nepodporovanej entite, dostanete chybu
- Dopyt vždy zahŕňa aktuálny stav záznamov ako posledný riadok (riadky) vo výslednej sade
- Archívne tabuľky môžu obsahovať mnoho verzií, preto používajte vhodné klauzuly where a parametre limit
- Časové pečiatky by mali byť poskytnuté vo formáte ISO 8601 (napr. "2025-01-01T12:00:00")
- Pre aktuálny riadok je _archiveValidTo NULL a _deleted je vždy false
Filtrovanie pomocou klauzúl WHERE
Parameter where používa náš výkonný systém filtrovania, ktorý podporuje rôzne operátory, logické podmienky a filtrovanie vzťahov. Zistite viac o všetkých dostupných operátoroch a pozrite si praktické príklady.
products(where: "price > 100 and category.name = 'Electronics'") { id, name, price }
[navigate:where.md|Zobraziť dokumentáciu klauzuly WHERE|filter]
Komplexný sprievodca možnosťami filtrovania a vyhľadávania
Výkon a osvedčené postupy
card: Eliminácia problému N+1
Systém automaticky zoskupuje a optimalizuje vnorené dopyty, aby zabránil problémom N+1 SQL
card: Selektívne načítavanie polí
Vyžiadajte si len polia, ktoré potrebujete, aby ste minimalizovali prenos a spracovanie dát
card: Používanie stránkovania
Vždy používajte limit a offset pre veľké súbory dát na zlepšenie doby odozvy. Predvolený limit je 1000 riadkov — použite limit: 0 pre neobmedzené výsledky (používajte opatrne).
card: Streamovanie výsledkov
Viaceré dopyty môžu vrátiť výsledky v optimalizovanom poradí pre lepšiu priepustnosť