Ao trabalhar com JSON no MariaDB, você pode usar expressões JSONPath para manipular dados em um documento JSON.
Um recurso poderoso que o MariaDB fornece é a etapa curinga (
**
). Isso permite que você selecione recursivamente todos os elementos filho do elemento atual. A etapa curinga é uma extensão não padrão e também é suportada com o mesmo significado no MySQL.
Exemplo
Segue um exemplo para demonstrar:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
Resultado:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
A etapa curinga passou por todos os objetos e selecionou os valores de seu
name
membros. Nesse caso, poderíamos ter obtido o mesmo resultado com outro seletor. O seletor curinga de array nos ajudaria a obter o mesmo resultado:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
Resultado:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Mesmo resultado.
No entanto, as coisas mudam se usarmos um documento diferente.
Exemplo 2
No exemplo a seguir, obtemos um resultado diferente entre a etapa curinga e o seletor de matriz:
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
Resultado:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
Resultado diferente.
Os resultados obviamente dependerão do documento e da construção real da expressão JSONPath, e os seletores usados dependerão de seus requisitos.
Uma coisa a lembrar é que a etapa curinga não deve ser a última etapa na expressão JSONPath. Ele deve ser seguido por uma etapa de seletor de membro de matriz ou objeto.
Exemplo 3
Aqui está um exemplo que retorna o segundo elemento de array de todos os arrays chamados
sizes
, incluindo matrizes aninhadas em outros documentos: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]');
Resultado:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+
As matrizes são baseadas em zero e, portanto,
$**.sizes[1]
refere-se ao segundo elemento em todos os sizes
matrizes.