Podczas pracy z JSON w MariaDB możesz używać wyrażeń JSONPath do manipulowania danymi w dokumencie JSON.
Jedną z potężnych funkcji udostępnianych przez MariaDB jest krok z symbolem wieloznacznym (**
). Pozwala to na rekursywne wybieranie wszystkich elementów podrzędnych bieżącego elementu.
Krok z symbolem wieloznacznym jest niestandardowym rozszerzeniem i jest również obsługiwany w tym samym znaczeniu w MySQL.
Przykład
Oto przykład do zademonstrowania:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
Wynik:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Krok z symbolem wieloznacznym przeszedł przez wszystkie obiekty i wybrał wartości z ich name
członków.
W tym przypadku ten sam wynik moglibyśmy osiągnąć innym selektorem. Selektor tablic wieloznacznych pomógłby nam uzyskać ten sam wynik:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
Wynik:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Ten sam wynik.
Jednak sytuacja się zmienia, jeśli użyjemy innego dokumentu.
Przykład 2
W poniższym przykładzie otrzymujemy inny wynik między krokiem wieloznacznym a selektorem tablicy:
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
Wynik:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
Inny wynik.
Wyniki będą oczywiście zależeć od dokumentu i rzeczywistej konstrukcji wyrażenia JSONPath, a użyte selektory będą zależeć od Twoich wymagań.
Należy pamiętać, że krok z symbolem wieloznacznym nie może być ostatnim krokiem w wyrażeniu JSONPath. Po nim musi następować krok selektora tablicy lub elementu obiektu.
Przykład 3
Oto przykład, który zwraca drugi element tablicy ze wszystkich tablic o nazwie sizes
, w tym tablice zagnieżdżone w innych dokumentach:
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]');
Wynik:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+
Tablice są liczone od zera, więc $**.sizes[1]
odnosi się do drugiego elementu we wszystkich sizes
tablice.