Halaman ini menjelaskan cara menggunakan jenis data JSONB saat menggunakan Spanner.
JSONB adalah jenis data PostgreSQL yang digunakan untuk menyimpan data semi-terstruktur
dalam dialek PostgreSQL Spanner. JSONB menyimpan data dalam
format JavaScript Object Notation (JSON), yang mengikuti spesifikasi
yang dijelaskan dalam RFC 7159.
Spesifikasi
Jenis data JSONB Spanner menyimpan representasi yang dinormalisasi
dari dokumen input. Hal ini berarti:
- Tanda kutip dan karakter spasi kosong tidak dipertahankan.
- Komentar tidak didukung. Transaksi atau kueri dengan komentar akan gagal.
- Kunci objek diurutkan terlebih dahulu berdasarkan panjang kunci, lalu secara leksikografis berdasarkan panjang kunci objek yang setara. Jika ada kunci objek duplikat, hanya kunci terakhir yang dipertahankan.
- Jenis primitif (
string,boolean,number, dannull) mempertahankan jenis dan nilainya.- Nilai jenis
stringdipertahankan persis. - Angka nol di akhir dipertahankan. Format output untuk nilai jenis
numbertidak menggunakan notasi ilmiah.
- Nilai jenis
Nilai
JSONBnulldiperlakukan sebagai non-NULLSQL. Contoh:SELECT null::jsonb IS NULL; -- Returns true SELECT 'null'::jsonb IS NULL; -- Returns false SELECT '{"a":null}'::jsonb -> 'a' IS NULL; -- Returns false SELECT '{"a":null}'::jsonb -> 'b' IS NULL; -- Returns true SELECT '{"a":null}'::jsonb -> 'a'; -- Returns a JSONB 'null' SELECT '{"a":null}'::jsonb -> 'b'; -- Returns a SQL NULLUrutan elemen array JSONB dipertahankan.
Pembatasan
Batasan berikut berlaku untuk Spanner JSONB:
- Argumen untuk fungsi
to_jsonbhanya dapat berasal dari jenis data PostgreSQL yang didukung Spanner. - Nilai jenis angka dapat memiliki 4.932 digit sebelum tanda desimal dan 16.383 digit setelah tanda desimal.
- Ukuran maksimum yang diizinkan untuk format penyimpanan yang dinormalisasi adalah 10 MB.
- Dokumen
JSONBharus dienkode dalam UTF-8. Transaksi atau kueri dengan dokumenJSONByang dienkode dalam format lain akan menampilkan error.
Perbandingan dan pengurutan
Anda dapat membandingkan nilai JSONB untuk kesetaraan dan pengurutan. Anda juga dapat menggunakan nilai JSONB dalam klausa GROUP BY dan ORDER BY.
Saat membandingkan nilai JSONB dari berbagai jenis, relasi berikut berlaku:
Null (JSONB null) < String < Number < Boolean < Array < Object
Saat membandingkan nilai JSONB dari jenis yang sama, aturan berikut berlaku:
- Objek: Objek dengan lebih banyak key-value pair lebih besar daripada objek dengan lebih sedikit pasangan. Jika kedua objek memiliki jumlah pasangan yang sama, key-value pair-nya akan dibandingkan secara berpasangan (kunci terlebih dahulu, lalu nilai) dalam urutan kunci yang ditentukan dalam Spesifikasi. Pasangan pertama yang berbeda menentukan urutan.
- Array: Array dengan lebih banyak elemen lebih besar daripada array dengan lebih sedikit elemen. Jika kedua array memiliki jumlah elemen yang sama, elemen akan dibandingkan indeks demi indeks dari kiri ke kanan. Elemen pertama yang berbeda menentukan urutan array.
- Boolean:
truelebih besar darifalse. - Angka: Dibandingkan secara matematis menggunakan perbandingan nilai numerik.
- String: Dibandingkan secara leksikografis menggunakan aturan perbandingan string standar.
Null JSONB: Semua nilai
JSONBnullsama satu sama lain dan lebih kecil dari nilai JSON non-null lainnya. Namun, ada kasus ekstrem yang berlaku:Array tingkat teratas kosong
[]dianggap lebih kecil daripada null JSONB. Karena ini hanya berlaku untuk array tingkat atas, pernyataan berikut menampilkan nilai benar (true):'[]'::jsonb < 'null'::jsonb'null'::jsonb < '[[]]'::jsonb'[null]'::jsonb < '[[]]'::jsonb
Membuat tabel dengan kolom JSONB
Anda dapat menambahkan kolom JSONB ke tabel saat membuat tabel.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
Contoh objek JSONB VenueFeatures adalah sebagai berikut:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
Menambahkan dan menghapus kolom JSONB dari tabel yang ada
Anda dapat menambahkan kolom JSONB dan menghapusnya menggunakan pernyataan ALTER sebagai berikut:
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
Contoh berikut menunjukkan cara menambahkan kolom JSONB bernama VenueDetails ke tabel Venues menggunakan library klien Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Mengubah data JSONB
Anda dapat mengubah kolom JSONB seperti kolom lainnya.
Berikut contohnya:
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
Contoh berikut menunjukkan cara mengupdate data JSONB menggunakan library klien Spanner.
C++
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
C#
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Go
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Java
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Node.js
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
PHP
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Python
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Ruby
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Mengindeks data JSON
Anda dapat mempercepat kueri data JSONB menggunakan indeks sekunder dan indeks penelusuran dengan data JSONB Anda. Spanner tidak mendukung penggunaan kolom jenis JSONB sebagai kunci dalam indeks sekunder.
Menggunakan indeks sekunder
Indeks sekunder berguna saat memfilter nilai skalar dalam dokumen JSONB. Untuk menggunakan indeks sekunder dengan JSONB, buat kolom yang dihasilkan yang mengekstrak data skalar yang relevan dan mentransmisikannya ke jenis data SQL yang sesuai. Kemudian, Anda dapat membuat indeks sekunder di kolom yang dihasilkan ini. Indeks mempercepat kueri yang memenuhi syarat yang berjalan terhadap kolom yang dihasilkan.
Dalam contoh berikut, Anda membuat indeks VenuesByCapacity yang digunakan database untuk menemukan tempat dengan kapasitas lebih dari 1.000. Alih-alih memeriksa setiap baris, Spanner menggunakan indeks untuk menemukan baris yang relevan, sehingga meningkatkan performa kueri, terutama untuk tabel besar.
ALTER TABLE Venues (
ADD COLUMN VenueCapacity BIGINT GENERATED ALWAYS AS ((VenueFeatures->>'capacity')::BIGINT) VIRTUAL,
DateOpened TIMESTAMPTZ
);
CREATE INDEX VenuesByCapacity ON Venues(VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
Menggunakan indeks penelusuran
Indeks penelusuran berguna saat Anda membuat kueri terhadap dokumen JSONB yang dinamis atau bervariasi. Tidak seperti indeks sekunder, Anda dapat membuat indeks penelusuran di dokumen JSONB apa pun yang disimpan dalam kolom JSONB. Indeks penelusuran otomatis beradaptasi dengan variasi di seluruh dokumen JSON, di antara baris yang berbeda, dan seiring waktu.
Dalam contoh berikut, Anda akan membuat indeks penelusuran VenuesByVenueDetails yang
digunakan database untuk menemukan tempat dengan detail tertentu seperti ukuran dan
jadwal operasional. Alih-alih memeriksa setiap baris, Spanner menggunakan
indeks untuk menemukan baris yang relevan, sehingga meningkatkan performa kueri,
terutama untuk tabel besar.
ALTER TABLE Venues
ADD COLUMN VenueDetails_Tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_jsonb(VenueDetails)) VIRTUAL HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venues (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE VenueDetails @> '{"labels": ["large"], "open": {"Friday": true}}'::jsonb;
SELECT VenueName
FROM Venues
WHERE VenueDetails->'open'->'Friday' = 'true'::jsonb
AND VenueDetails->'type' IN ('"stadium"'::jsonb, '"arena"'::jsonb);
Untuk mengetahui informasi selengkapnya, lihat Indeks penelusuran JSON.
Membuat kueri data JSONB
Anda dapat mengkueri kolom JSONB berdasarkan nilai kolom yang mendasarinya. Contoh berikut mengekstrak VenueId dan VenueName dari Venues dengan VenueFeatures memiliki nilai rating yang lebih besar dari 3.5.
SELECT VenueId, VenueName
FROM Venues
WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
Contoh berikut menunjukkan cara membuat kueri data JSONB menggunakan library klien Spanner.
C++
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
C#
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Go
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Java
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Node.js
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
PHP
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Python
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Ruby
Untuk mempelajari cara menginstal dan menggunakan library klien untuk Spanner, lihat library klien Spanner.
Untuk melakukan autentikasi ke Spanner, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Fitur JSONB PostgreSQL yang tidak didukung
Fitur JSONB PostgreSQL open source berikut tidak didukung di Spanner JSONB:
- PrimaryKey dan ForeignKey
- Pengindeksan, termasuk indeks GIN. Sebagai gantinya, Anda dapat menggunakan indeks penelusuran Spanner, yang mempercepat operasi JSONB yang sama dengan indeks GIN. Untuk mengetahui informasi selengkapnya, lihat Mengindeks data JSON.
- Mengubah kolom
JSONBmenjadi atau dari jenis data lainnya - Menggunakan kueri berparameter dengan parameter JSONB tanpa jenis di alat yang menggunakan protokol kabel PostgreSQL
Menggunakan pemaksaan di mesin kueri. Tidak seperti PostgreSQL open source, pemaksaan implisit dari
JSONBke teks tidak didukung. Anda harus menggunakan pemeranan eksplisit dari jenisJSONBagar cocok dengan tanda tangan fungsi. Misalnya:SELECT concat('abc'::text, '{"key1":1}'::jsonb); -- Returns error SELECT concat('abc'::text, CAST('{"key1":1}'::jsonb AS TEXT)); -- This works SELECT 3 + CAST('5'::jsonb AS INTEGER); -- This works