Quando si lavora con JSON in MariaDB, è possibile utilizzare le espressioni JSONPath per manipolare i dati all'interno di un documento JSON.
Una potente funzionalità fornita da MariaDB è il passaggio con caratteri jolly (**
). Ciò ti consente di selezionare ricorsivamente tutti gli elementi figlio dell'elemento corrente.
Il passaggio con caratteri jolly è un'estensione non standard ed è supportato anche con lo stesso significato in MySQL.
Esempio
Ecco un esempio da dimostrare:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
Risultato:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Il passaggio con caratteri jolly ha esaminato tutti gli oggetti e selezionato i valori dal loro name
membri.
In questo caso avremmo potuto ottenere lo stesso risultato con un altro selettore. Il selettore di caratteri jolly dell'array ci avrebbe aiutato a ottenere lo stesso risultato:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
Risultato:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Stesso risultato.
Tuttavia, le cose cambiano se utilizziamo un documento diverso.
Esempio 2
Nell'esempio seguente, otteniamo un risultato diverso tra il passaggio con caratteri jolly e il selettore di array:
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
Risultato:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
Risultato diverso.
I risultati dipenderanno ovviamente dal documento e dall'effettiva costruzione dell'espressione JSONPath e i selettori utilizzati dipenderanno dalle tue esigenze.
Una cosa da ricordare è che il passaggio con caratteri jolly non deve essere l'ultimo passaggio nell'espressione JSONPath. Deve essere seguito da un passaggio di selezione del membro di matrice o oggetto.
Esempio 3
Ecco un esempio che restituisce il secondo elemento dell'array da tutti gli array chiamati sizes
, inclusi gli array nidificati all'interno di altri documenti:
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]');
Risultato:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+
Gli array sono a base zero e quindi $**.sizes[1]
si riferisce al secondo elemento in tutte le sizes
matrici.