Når du arbejder med JSON i MariaDB, kan du bruge JSONPath-udtryk til at manipulere data i et JSON-dokument.
En kraftfuld funktion, som MariaDB tilbyder, er jokertegntrinnet (**
). Dette giver dig mulighed for rekursivt at vælge alle underordnede elementer af det aktuelle element.
Jokertegntrinnet er en ikke-standardudvidelse, og det understøttes også med samme betydning i MySQL.
Eksempel
Her er et eksempel til demonstration:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
Resultat:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Jokertegntrinnet gik gennem alle objekter og valgte værdierne fra deres name
medlemmer.
I dette tilfælde kunne vi have opnået det samme resultat med en anden vælger. Array-jokertegnvælgeren ville have hjulpet os med at få det samme resultat:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
Resultat:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Samme resultat.
Men tingene ændrer sig, hvis vi bruger et andet dokument.
Eksempel 2
I det følgende eksempel får vi et andet resultat mellem jokertegntrinnet og matrixvælgeren:
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
Resultat:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
Anderledes resultat.
Resultaterne vil naturligvis afhænge af dokumentet og den faktiske konstruktion af JSONPath-udtrykket, og de anvendte vælgere vil afhænge af dine krav.
En ting at huske er, at jokertegntrinnet ikke må være det sidste trin i JSONPath-udtrykket. Det skal efterfølges af et array- eller objektmedlemsvælgertrin.
Eksempel 3
Her er et eksempel, der returnerer det andet array-element fra alle arrays kaldet sizes
, inklusive arrays, der er indlejret i andre dokumenter:
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]');
Resultat:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+
Arrays er nul-baserede og derfor $**.sizes[1]
henviser til det andet element i alle sizes
arrays.