Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A lekérdezési nyelvben az adatok sémamentesek és általában denormalizáltak. Ahelyett, hogy adatokat illesztene össze entitások és csoportok között, például egy relációs adatbázisban, az illesztések egyetlen elemen belül történnek. Az illesztések hatóköre az adott elemre terjed ki, és nem fordul elő több elem és tároló között.
Jótanács
Ha úgy találja, hogy több elemhez és tárolóhoz kell csatlakoznia, fontolja meg az adatmodell újradolgozását, hogy elkerülje ezt az antimintát.
Önálló illesztés egyetlen elem használatával
Tekintsünk meg egy példát egy elemen belüli öncsatlakozásra. Fontolja meg egy egyetlen elemből álló tárolót. Ez az elem egy különböző méretű terméket jelöl:
[
{
"name": "Raiot Jacket",
"sizes": [
{
"key": "s",
"description": "Small"
},
{
"key": "m",
"description": "Medium"
},
{
"key": "l",
"description": "Large"
},
{
"key": "xl",
"description": "Extra Large"
}
]
}
]
Mi a teendő, ha egy adott méretű terméket szeretne találni? Általában olyan lekérdezést kell írnia, amely szűrővel ellenőrzi a tömb összes lehetséges indexét sizes egy előtaggal rendelkező értékhez. Ebben a példában a lekérdezés az összes olyan méretű terméket megkeresi, amely a következővel Largevégződik:
SELECT
*
FROM
products p
WHERE
p.sizes[0].description LIKE "%Large" OR
p.sizes[1].description LIKE "%Large" OR
p.sizes[2].description LIKE "%Large" OR
p.sizes[3].description LIKE "%Large"
Ez a technika gyorsan elérhetetlenné válhat. A lekérdezés szintaxisának összetettsége vagy hossza növeli a tömb lehetséges elemeinek számát. Emellett ez a lekérdezés nem elég rugalmas ahhoz, hogy kezelni tudja a jövőbeli termékeket, amelyek háromnál több méretben is lehetnek.
A hagyományos relációs adatbázisokban a méretek külön táblára lesznek elválasztva, és egy táblázatközi illesztés az eredményekre alkalmazott szűrővel történik. A lekérdezési nyelven önbeillesztési műveletet hajthatunk végre az elemen belül a JOIN következő kulcsszóval:
SELECT
p.name,
s.key,
s.description
FROM
products p
JOIN
s in p.sizes
Ez a lekérdezés egy egyszerű tömböt ad vissza, amely a címkék tömbjének minden értékéhez tartalmaz egy elemet.
[
{
"name": "Raiot Jacket",
"key": "s",
"description": "Small"
},
{
"name": "Raiot Jacket",
"key": "m",
"description": "Medium"
},
{
"name": "Raiot Jacket",
"key": "l",
"description": "Large"
},
{
"name": "Raiot Jacket",
"key": "xl",
"description": "Extra Large"
}
]
Bontsuk le a lekérdezést. A lekérdezésnek most két aliasa van: p az eredményhalmaz minden termékeleméhez és s az önkiszolgáló sizes tömbhöz. A * kulcsszó csak akkor érvényes az összes mező kivetítésére, ha ki tudja következtetni a bemeneti készletet, de most két bemeneti készlet van (p és t). A korlátozás miatt explicit módon meg kell határoznunk a visszaadott mezőket name a terméktől keyés description a mérettől.
Végül egy szűrővel megkereshetjük a végződésű Largeméreteket. Mivel a kulcsszót JOIN használtuk, a szűrő elég rugalmas ahhoz, hogy bármilyen változó számú címkét kezeljen:
SELECT
p.name,
s.key AS size
FROM
products p
JOIN
s in p.sizes
WHERE
s.description LIKE "%Large"
[
{
"name": "Raiot Jacket",
"size": "l"
},
{
"name": "Raiot Jacket",
"size": "xl"
}
]
Több elem önálló csatlakoztatása
Térjünk át egy olyan mintára, amelyben egy több elemben létező tömbön belüli értéket kell keresnünk. Ebben a példában vegye figyelembe a két termékelemet tartalmazó tárolót. Minden elem az adott elem szempontjából releváns colors elemeket tartalmaz.
[
{
"name": "Gremon Fins",
"colors": [
"science-blue",
"turbo"
]
},
{
"name": "Elecy Jacket",
"colors": [
"indigo-shark",
"jordy-blue-shark"
]
},
{
"name": "Tresko Pack",
"colors": [
"golden-dream"
]
}
]
Mi a teendő, ha minden olyan elemet meg kell keresnie, amelynek színe szerepel blue a névben? Manuálisan is megkeresheti a sztringet blue, de olyan összetett lekérdezést kell írnia, amely az elemek két jellemzőjét tartalmazza:
Az alsztringgel ellátott
blueszínek az egyes tömbök különböző indexeiben fordulnak elő.Elecy JacketA termék esetében a szín a második elem (index:1).Gremon FinsA termék esetében a címke az első elem (index:0). ATresko Packtermék nem rendelkezik olyan termékel, amely tartalmazza ezt az alsztringet.Az
colorsegyes elemek tömbje eltérő hosszúságú.Gremon FinsMindkétElecy Jacketterméknek két színe van, míg aTresko Packterméknek csak egy színe van.
Itt a JOIN kulcsszó nagyszerű eszköz az elemek és színek kereszttermékének létrehozásához. Az illesztések az illesztésben részt vevő készletek teljes kereszttermékét hozzák létre. Az eredmény az elem és a megcélzott tömb értékeinek minden permutációjával rendelkező halmaz.
A mintatermékek és színek illesztési művelete a következő elemeket hozza létre:
| Termék | Szín |
|---|---|
Gremon Fins |
science-blue |
Gremon Fins |
turbo |
Elecy Jacket |
indigo-shark |
Elecy Jacket |
jordy-blue-shark |
Tresko Pack |
golden-dream |
Ez a példa NoSQl-lekérdezés a JOIN kulcsszót használja egy termékközi létrehozáshoz, és az összes permutációt visszaadja:
SELECT
p.name,
c AS color
FROM
products p
JOIN
c in p.colors
[
{
"name": "Elecy Jacket",
"color": "indigo-shark"
},
{
"name": "Elecy Jacket",
"color": "jordy-blue-shark"
},
{
"name": "Gremon Fins",
"color": "science-blue"
},
{
"name": "Gremon Fins",
"color": "turbo"
},
{
"name": "Tresko Pack",
"color": "golden-dream"
}
]
Az egyetlen elemhez hasonlóan itt is alkalmazhat szűrőt, hogy csak egy adott címkének megfelelő elemeket találjon. Ez a lekérdezés például megkeresi az összes olyan alsztringet tartalmazó elemet, amely blue megfelel az ebben a szakaszban korábban említett kezdeti követelménynek.
SELECT
p.name,
c AS color
FROM
products p
JOIN
c in p.colors
WHERE
c LIKE "%blue%"
[
{
"name": "Elecy Jacket",
"color": "jordy-blue-shark"
},
{
"name": "Gremon Fins",
"color": "science-blue"
}
]
Ez a lekérdezés tovább finomítható, hogy csak a szűrőnek megfelelő termékek nevét adja vissza. Ez a példa nem veti ki a színértékeket, de a szűrő továbbra is a várt módon működik:
SELECT VALUE
p.name
FROM
products p
JOIN
c in p.colors
WHERE
c LIKE "%blue%"
[
"Elecy Jacket",
"Gremon Fins"
]