Когато работите с JSON в MariaDB, можете да използвате JSONPath изрази, за да манипулирате данни в JSON документ.
Една мощна функция, която MariaDB предоставя, е стъпката за заместващ знак (**
). Това ви позволява да избирате рекурсивно всички дъщерни елементи на текущия елемент.
Стъпката със заместващи знаци е нестандартно разширение и също се поддържа със същото значение в MySQL.
Пример
Ето пример за демонстрация:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
Резултат:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Стъпката със заместващ знак премина през всички обекти и избра стойностите от тяхното name
членове.
В този случай можехме да постигнем същия резултат с друг селектор. Селекторът за заместващи символи на масива би ни помогнал да получим същия резултат:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
Резултат:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Същият резултат.
Нещата обаче се променят, ако използваме различен документ.
Пример 2
В следващия пример получаваме различен резултат между стъпката на заместващия знак и селектора на масив:
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
Резултат:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
Различен резултат.
Резултатите очевидно ще зависят от документа и действителната конструкция на израза JSONPath, а използваните селектори ще зависят от вашите изисквания.
Едно нещо, което трябва да запомните, е, че стъпката с заместващ знак не трябва да е последната стъпка в израза JSONPath. Тя трябва да бъде последвана от стъпка за избор на член на масив или обект.
Пример 3
Ето пример, който връща втория елемент на масива от всички масиви, наречен sizes
, включително масиви, които са вложени в други документи:
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]');
Резултат:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+
Масивите са базирани на нула и така $**.sizes[1]
се отнася до втория елемент във всички sizes
масиви.