Saat bekerja dengan JSON di MariaDB, Anda dapat menggunakan ekspresi JSONPath untuk memanipulasi data dalam dokumen JSON.
Salah satu fitur canggih yang disediakan MariaDB adalah langkah wildcard (**
). Ini memungkinkan Anda untuk memilih semua elemen turunan dari elemen saat ini secara rekursif.
Langkah wildcard adalah ekstensi non-standar, dan juga didukung dengan arti yang sama di MySQL.
Contoh
Berikut ini contoh untuk didemonstrasikan:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$**.name');
Hasil:
+------------------------------------+ | JSON_EXTRACT(@json, '$**.name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Langkah wildcard melewati semua objek dan memilih nilai dari name
anggota.
Dalam hal ini, kami dapat mencapai hasil yang sama dengan pemilih lain. Pemilih wildcard array akan membantu kami mendapatkan hasil yang sama:
SET @json = '[
{ "name" : "Wag", "type" : "Dog" },
{ "name" : "Bark", "type" : "Dog" },
{ "name" : "Meow", "type" : "Cat" },
{ "name" : "Scratch", "type" : "Cat" }
]';
SELECT JSON_EXTRACT(@json, '$[*].name');
Hasil:
+------------------------------------+ | JSON_EXTRACT(@json, '$[*].name') | +------------------------------------+ | ["Wag", "Bark", "Meow", "Scratch"] | +------------------------------------+
Hasil yang sama.
Namun, hal-hal berubah jika kita menggunakan dokumen yang berbeda.
Contoh 2
Dalam contoh berikut, kita mendapatkan hasil yang berbeda antara langkah wildcard dan pemilih array:
SET @json = '[
{
"name" : "Homer",
"pets" : [
{
"name" : "Wag",
"type" : "Dog"
},
{
"name" : "Scratch",
"type" : "Cat"
}
]
}
]';
SELECT
JSON_EXTRACT(@json, '$**.name'),
JSON_EXTRACT(@json, '$[*].name');
Hasil:
+---------------------------------+----------------------------------+ | JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') | +---------------------------------+----------------------------------+ | ["Homer", "Wag", "Scratch"] | ["Homer"] | +---------------------------------+----------------------------------+
Hasil yang berbeda.
Hasilnya jelas akan bergantung pada dokumen dan konstruksi sebenarnya dari ekspresi JSONPath, dan pemilih yang digunakan akan bergantung pada kebutuhan Anda.
Satu hal yang perlu diingat adalah bahwa langkah wildcard tidak boleh menjadi langkah terakhir dalam ekspresi JSONPath. Itu harus diikuti oleh langkah pemilih anggota array atau objek.
Contoh 3
Berikut adalah contoh yang mengembalikan elemen larik kedua dari semua larik yang disebut sizes
, termasuk larik yang bersarang di dalam dokumen lain:
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]');
Hasil:
+-------------------------------------+ | JSON_EXTRACT(@json, '$**.sizes[1]') | +-------------------------------------+ | ["M", "Narrow", "Medium"] | +-------------------------------------+
Array berbasis nol dan karenanya $**.sizes[1]
mengacu pada elemen kedua dalam semua sizes
array.