このページでは、Spanner を使用するときに JSONB
データ型を操作する方法について説明します。
JSONB
は、Spanner PostgreSQL 言語で半構造化データを保持するために使用される PostgreSQL データ型です。JSONB
は、RFC 7159 で説明されている仕様に準拠した JavaScript Object Notation(JSON)形式のデータを保持します。
仕様
Spanner の JSONB
データ型は、入力ドキュメントの正規化表現を格納します。これは、次のことを意味します。
- 引用符と空白文字は保持されません。
- コメントはサポートされません。コメント付きのトランザクションやクエリは失敗します。
- オブジェクト キーは、まずキーの長さで並べ替えられ、次に辞書順で同等のオブジェクト キー長で並べ替えられます。オブジェクト キーが重複している場合は、最後のキーのみが保持されます。
- プリミティブ型(
string
、boolean
、number
、null
)は、その型と値を保持します。string
型の値は厳密に保持されます。- 末尾のゼロは保持されます。
number
型の値の出力形式では、科学的記数法は使用されません。
JSONB
null
値は SQL 非NULL
として扱われます。次に例を示します。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 NULL
JSONB 配列要素の順序は保持されます。
制限事項
Spanner JSONB
には次の制限が適用されます。
to_jsonb
関数の引数には、Spanner がサポートする PostgreSQL データ型のみを使用できます。- 数値型は、小数点の前に 4,932 桁、小数点の後に 16,383 桁を指定できます。
- 正規化されたストレージ形式の最大許容サイズは 10 MB です。
JSONB
ドキュメントは UTF-8 でエンコードする必要があります。他の形式でエンコードされたJSONB
ドキュメントを含むトランザクションやクエリはエラーを返します。
JSONB 列があるテーブルを作成する
テーブルを作成する際に、JSONB
列をテーブルに追加できます。
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
VenueFeatures
JSONB
オブジェクトの例を次に示します。
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
既存のテーブルへの JSONB 列の追加と削除
次のように ALTER
ステートメントを使用することで、JSONB
列の追加と削除ができます。
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
次のサンプルでは、Spanner クライアント ライブラリを使用して、VenueDetails
という JSONB
列を Venues
テーブルに追加する方法を示します。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
JSONB データを変更する
JSONB
列は、他の列と同じように変更できます。
以下に例を示します。
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
次のサンプルでは、Spanner クライアント ライブラリを使用して JSONB
データを更新する方法を示します。
C++
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
C#
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Go
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Java
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Node.js
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
PHP
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Python
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
JSONB データのクエリを行う
JSONB
列は、基盤となるフィールドの値に基づいてクエリできます。次の例では、Venues
から VenueId
と VenueName
を抽出します。ここで VenueFeatures
には 3.5
より大きい rating
の値があります。
SELECT VenueId, VenueName FROM Venues WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
次のサンプルでは、Spanner クライアント ライブラリを使用して、JSONB
データにクエリを実行する方法を示します。
C++
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
C#
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Go
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Java
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Node.js
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
PHP
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Python
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
サポートされていない PostgreSQL JSONB 機能
次の PostgreSQL JSONB
機能は、Spanner JSONB
ではサポートされていません。
- 並べ替え、比較、集計
- PrimaryKey と ForeignKey
- GIN インデックスを含むインデックス処理。詳細については、インデックス処理をご覧ください。
JSONB
列を他のデータ型にまたは他のデータ型からの変更- PostgreSQL ワイヤ プロトコルを使用するツールで、型なしの JSONB パラメータでパラメータ化されたクエリの使用
クエリエンジンで強制型変換。標準 PostgreSQL とは異なり、
JSONB
からテキストへの強制変換はサポートされていません。有効なJSON
文字列のみが、関数シグネチャと一致するようにJSONB
型に強制変換されます。例:SELECT concat('abc'::text, '{"key1":1}'::jsonb); -- Returns error SELECT concat('abc'::text, CAST('{"key1":1}'::jsonb AS TEXT)); -- This works
インデックス登録
JSONB
列はインデックス作成をサポートしません。ただし、生成された列にインデックスを作成して、JSONB
列からスカラー値を抽出できます。
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
TotalCapacity BIGINT GENERATED ALWAYS AS ((VenueFeatures->>'capacity')::BIGINT) STORED,
DateOpened TIMESTAMPTZ
);
CREATE INDEX VenuesByCapacity ON Venues(TotalCapacity);