Menyiasat elemen tatasusunan JSON dalam PostgreSQL
PostgreSQL 9.3 dan kemudian menyokong jenis data JSON, membenarkan data JSON disimpan dan dimanipulasi dalam pangkalan data. Ciri ini membolehkan menyimpan struktur data yang kompleks (seperti tatasusunan objek) ke dalam satu lajur. Walau bagaimanapun, pertanyaan untuk elemen atau nilai tertentu dalam struktur kompleks ini boleh menjadi mencabar.
Anggap bahawa lajur bernama "data" dalam jadual "laporan" menyimpan data JSON berikut:
<code class="language-json">{ "objects": [ {"src":"foo.png"}, {"src":"bar.png"} ], "background":"background.png" }</code>
Tugas biasa ialah untuk mendapatkan semula semua laporan yang mengandungi nilai khusus daripada medan "src" tatasusunan "objek". Menyoal medan JSON rata seperti "latar belakang" adalah mudah, tetapi mengekstrak elemen dalam tatasusunan memerlukan pendekatan yang berbeza.
Pertanyaan berikut berjaya mendapatkan semula semua laporan yang sepadan dengan nilai "latar belakang" yang diberikan:
<code class="language-sql">SELECT data AS data FROM reports WHERE data->>'background' = 'background.png'</code>
Walau bagaimanapun, cuba tanya nilai dalam tatasusunan "objek" menggunakan sintaks yang serupa (contohnya):
<code class="language-sql">SELECT data AS data FROM reports WHERE data->>'objects' = 'foo.png'</code>
tidak akan menghasilkan hasil yang diharapkan kerana "objek" ialah tatasusunan, bukan medan mudah.
Untuk berjaya menanya elemen dalam tatasusunan JSON, anda boleh menggunakan fungsi json_array_elements()
dalam gabungan mendatar. Fungsi ini mengekstrak satu elemen daripada tatasusunan, membolehkan anda menguji setiap elemen secara individu.
Pertanyaan berikut menggunakan cantuman sisi untuk mengembangkan tatasusunan "objek" dan menguji kehadiran nilai "src" tertentu:
<code class="language-sql">SELECT data AS data FROM reports r, json_array_elements(r.data#>'{objects}') obj WHERE obj->>'src' = 'foo.png';</code>
Sebagai alternatif, untuk satu tahap sarang, anda boleh menggunakan versi ringkas pertanyaan:
<code class="language-sql">SELECT * FROM reports r, json_array_elements(r.data->>'objects') obj WHERE obj->>'src' = 'foo.png';</code>
Pertanyaan ini menggunakan operator #>
, ->
dan ->>
untuk melintasi struktur JSON. Lihat dokumentasi PostgreSQL untuk butiran mengenai operator ini.
Selain itu, untuk mengoptimumkan prestasi pertanyaan JSON kompleks yang melibatkan tatasusunan, pertimbangkan untuk menambah indeks GIN pada ungkapan JSON yang berkaitan. Ini boleh meningkatkan kelajuan carian dengan ketara, terutamanya dalam kes set data yang besar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyoal Elemen Khusus Dalam Tatasusunan JSON dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!