このページでは、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 列を追加する、あるいは 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 型の列を使用することはできません。
セカンダリ インデックスを使用する
セカンダリ インデックスは、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