Wanneer u met JSON in MariaDB werkt, kunt u JSONPath-expressies gebruiken om gegevens in een JSON-document te manipuleren.
Een krachtige functie die MariaDB biedt, is de stap met jokertekens (**
). Hiermee kunt u recursief alle onderliggende elementen van het huidige element selecteren.
De wildcard-stap is een niet-standaard extensie en wordt ook met dezelfde betekenis ondersteund in MySQL.
Voorbeeld
Hier is een voorbeeld om te demonstreren:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
Resultaat:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
De wildcard-stap doorliep alle objecten en selecteerde de waarden uit hun name
leden.
In dit geval hadden we hetzelfde resultaat kunnen bereiken met een andere selector. De array-wildcardselector zou ons hebben geholpen om hetzelfde resultaat te krijgen:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
Resultaat:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Zelfde resultaat.
De dingen veranderen echter als we een ander document gebruiken.
Voorbeeld 2
In het volgende voorbeeld krijgen we een ander resultaat tussen de jokerstap en de arraykiezer:
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
Resultaat:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
Ander resultaat.
De resultaten zijn uiteraard afhankelijk van het document en de feitelijke constructie van de JSONPath-expressie, en de gebruikte selectors zijn afhankelijk van uw vereisten.
Een ding om te onthouden is dat de stap met jokertekens niet de laatste stap in de JSONPath-expressie mag zijn. Het moet worden gevolgd door een stap voor het selecteren van een array of objectlid.
Voorbeeld 3
Hier is een voorbeeld dat het tweede array-element retourneert van alle arrays genaamd sizes
, inclusief arrays die in andere documenten zijn genest:
SET @json = '[
{
"_id": 1,
"product": {
"name" : "Tuxedo",
"color" : "Blue",
"sizes": [ "S", "M", "L" ],
"accessories" : {
"belt" : {
"color" : "Navy",
"sizes" : [ "Wide", "Narrow" ]
},
"tie" : {
"color" : "Black",
"sizes" : [ "Short", "Medium", "Long" ]
}
}
}
}
]';
SELECT JSON_EXTRACT(@json, '$**.sizes[1]');
Resultaat:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+
Arrays zijn gebaseerd op nul en dus $**.sizes[1]
verwijst naar het tweede element in alle sizes
arrays.