このページでは、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 への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
JSON データをインデックスに登録する
JSONB データでセカンダリ インデックスと検索インデックスを使用すると、JSONB データのクエリを高速化できます。Spanner では、セカンダリ インデックスのキーとして JSONB 型の列を使用することはできません。
セカンダリ インデックスを使用する
2 番目のインデックスは、JSONB ドキュメント内のスカラー値に対してフィルタする場合に便利です。JSONB でセカンダリ インデックスを使用するには、関連するスカラーデータを抽出して適切な SQL データ型にキャストする生成列を作成します。次に、この生成された列にセカンダリ インデックスを作成できます。このインデックスにより、生成された列に対して実行される対象クエリが高速化されます。
次の例では、データベースが容量が 1, 000 を超える会場を見つけるために使用する VenuesByCapacity
インデックスを作成します。Spanner は、すべての行を確認するのではなく、インデックスを使用して関連する行を見つけるため、特に大規模なテーブルでクエリのパフォーマンスが向上します。
ALTER TABLE Venues (
ADD COLUMN VenueCapacity BIGINT GENERATED ALWAYS AS ((VenueFeatures->>'capacity')::BIGINT) VIRTUAL,
DateOpened TIMESTAMPTZ
);
CREATE INDEX VenuesByCapacity ON Venues(TotalCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
検索インデックスを使用する
検索インデックスは、動的または多様な JSONB ドキュメントに対してクエリを実行する場合に便利です。セカンダリ インデックスとは異なり、JSONB 列に保存されている任意の JSONB ドキュメントに対して検索インデックスを作成できます。検索インデックスは、JSON ドキュメント間、行間、時間の経過に伴う変化に自動的に適応します。
次の例では、データベースがサイズや営業スケジュールなどの特定の詳細情報を持つ会場を見つけるために使用する VenuesByVenueDetails
検索インデックスを作成します。Spanner は、すべての行を確認するのではなく、インデックスを使用して関連する行を見つけるため、特に大規模なテーブルでクエリのパフォーマンスが向上します。
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;
詳細については、JSON 検索インデックスをご覧ください。
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 インデックスを含むインデックス処理。代わりに Spanner 検索インデックスを使用できます。これにより、GIN インデックスと同じ JSONB オペレーションが高速化されます。詳細については、JSON データをインデックスに登録するをご覧ください。
JSONB
列を他のデータ型にまたは他のデータ型からの変更- PostgreSQL ワイヤ プロトコルを使用するツールで、型なしの JSONB パラメータでパラメータ化されたクエリの使用
クエリエンジンで強制型変換を使用する。オープンソースの PostgreSQL とは異なり、
JSONB
からテキストへの暗黙的な型変換はサポートされていません。関数シグネチャを一致させるには、JSONB
型からの明示的なキャスティングを使用する必要があります。次に例を示します。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