本頁面說明如何使用 Spanner 處理 JSON。
JSON 資料類型是半結構化資料類型,用於保存 JSON (JavaScript 物件標記法) 資料。JSON 格式的規格請參閱 RFC 7159。
JSON 可用於補充關聯式結構定義,適用於稀疏或結構定義鬆散或變動的資料。不過,查詢最佳化工具會依賴關聯模型,有效率地大規模篩選、彙整、匯總及排序。JSON 查詢的內建最佳化功能較少,且檢查及調整效能的功能也較少。
規格
Spanner JSON 類型會儲存輸入 JSON 文件的標準化表示法。
- JSON 最多可巢狀至 80 層。
- 不會保留空白字元。
- 不支援註解。含有註解的交易或查詢會失敗。
- JSON 物件的成員會依字母順序排序。
- JSON 陣列元素會保留順序。
- 如果 JSON 物件有重複的鍵,系統只會保留第一個。
- 原始類型 (字串、布林值、數字和空值) 會保留其類型和值。
- 字串類型值會完整保留。
- 數字類型值會保留,但文字表示法可能會因正規化程序而變更。舉例來說,輸入數字 10000 的正規化表示法可能是 1e+4。數值保留語意如下:
- 系統會保留 [INT64_MIN, INT64_MAX] 範圍內的帶正負號整數。
- 系統會保留 [0, UINT64_MAX] 範圍內不帶正負號的整數。
- 如果雙精度浮點數值可從字串轉換為雙精度浮點數,再轉換回字串,且不會遺失小數精確度,則會保留。如果雙精度浮點值無法以這種方式來回,交易或查詢就會失敗。
- 例如,
SELECT JSON '2.2412421353246235436'會失敗。 - 可行的解決方法是
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round'),會傳回JSON '2.2412421353246237'。
- 例如,
- 使用
TO_JSON()、JSON_OBJECT()和JSON_ARRAY()函式,在 SQL 中建構 JSON 文件。這些函式會實作必要的引號和逸出字元。
正規化文件的大小上限為 10 MB。
是否可以為空值
JSON null 值會視為 SQL 非 NULL。
例如:
SELECT (JSON '{"a":null}').a IS NULL; -- Returns FALSE
SELECT (JSON '{"a":null}').b IS NULL; -- Returns TRUE
SELECT JSON_QUERY(JSON '{"a":null}', "$.a"); -- Returns a JSON 'null'
SELECT JSON_QUERY(JSON '{"a":null}', "$.b"); -- Returns a SQL NULL
編碼
JSON 文件必須以 UTF-8 編碼。如果交易或查詢中的 JSON 文件採用其他格式編碼,則會傳回錯誤。
建立含有 JSON 資料欄的資料表
建立資料表時,可以新增 JSON 資料欄。JSON 類型值可為空值。
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
在現有資料表中新增及移除 JSON 資料欄
您也可以在現有資料表中新增及捨棄 JSON 資料欄。
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
以下範例說明如何使用 gcloud CLI 和 Spanner 用戶端程式庫,將名為 VenueDetails 的 JSON 資料欄新增至 Venues 資料表。
gcloud
gcloud spanner databases ddl update DATABASE_ID \ --instance=INSTANCE_ID \ --ddl="ALTER TABLE Venues ADD COLUMN VenueDetails JSON;"
C++
C#
Go
Java
Node.js
PHP
Python
小茹
修改 JSON 資料
以下範例說明如何使用 gcloud CLI 和 Spanner 用戶端程式庫更新 JSON 資料。
gcloud
gcloud spanner databases execute-sql DATABASE_ID --instance=INSTANCE_ID \ --sql="UPDATE Venues SET VenueDetails = JSON '{\"rating\": 9, \"open\": true}' WHERE VenueId = 1"
C++
C++
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
C#
C#
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Go
Go
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Java
Java
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Node.js
Node.js
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
PHP
PHP
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Python
Python
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
小茹
Ruby
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
建立 JSON 資料索引
您可以搭配使用次要索引和搜尋索引與 JSON 資料,加快查詢 JSON 資料的速度。Spanner 不支援在次要索引中使用 JSON 類型資料欄做為索引鍵。
使用次要索引
如要篩選 JSON 文件中的純量值,次要索引就非常實用。如要搭配 JSON 使用次要索引,請建立產生的資料欄,擷取相關純量資料,並將資料轉換為適當的 SQL 類型。接著,您可以為這個產生的資料欄建立次要索引。索引會加快對生成資料欄執行的合格查詢。
在以下範例中,您會建立 VenuesByCapacity 索引,資料庫會使用該索引尋找容納人數大於 1000 的場地。Spanner 不會檢查每個資料列,而是使用索引找出相關資料列,進而提升查詢效能,尤其是大型資料表。
ALTER TABLE Venues
ADD COLUMN VenueCapacity INT64 AS (INT64(VenueDetails.capacity));
CREATE INDEX VenuesByCapacity ON Venue (VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
使用搜尋索引
查詢動態或多樣化的 JSON 文件時,搜尋索引非常實用。與次要索引不同,您可以針對儲存在 JSON 資料欄中的任何 JSON 文件建立搜尋索引。搜尋索引會自動適應 JSON 文件、不同資料列和時間的變化。
在以下範例中,您會建立 VenuesByVenueDetails 搜尋索引,資料庫會使用該索引尋找具有特定詳細資料 (例如大小和營業時間) 的場地。Spanner 不會檢查每個資料列,而是使用索引找出相關資料列,進而提升查詢效能,尤其是大型資料表。
ALTER TABLE Venues
ADD COLUMN VenueDetails_Tokens TOKENLIST AS (TOKENIZE_JSON(VenueDetails)) HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venue (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE JSON_CONTAINS(VenueDetails, JSON '{"labels": ["large"], "open": {"Friday": true}}');
SELECT VenueName
FROM Venues
WHERE VenueDetails.open.Friday = true
AND VenueDetails.type IN ("stadium", "arena");
詳情請參閱「JSON 搜尋索引」。
查詢 JSON 資料
以下範例說明如何使用 gcloud CLI 和 Spanner 用戶端程式庫查詢 JSON 資料。
gcloud
gcloud spanner databases execute-sql DATABASE_ID --instance=INSTANCE_ID \ --sql="SELECT VenueId, VenueDetails FROM Venues \ WHERE JSON_VALUE(VenueDetails, '$.rating') = '9'"
C++
C++
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
C#
C#
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Go
Go
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Java
Java
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Node.js
Node.js
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
PHP
PHP
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Python
Python
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
小茹
Ruby
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱「Spanner 用戶端程式庫」。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
比較和排序
您可以比較 JSON 值是否相等和排序。您也可以在 GROUP BY 和 ORDER BY 子句中使用 JSON 值。如要加快唯讀交易中 JSON 欄或其子路徑的等式比較,可以使用搜尋索引。
如需詳細規則和語意,請參閱「JSON 比較和排序」。
限制
- JSON 類型資料欄不得做為主鍵或次要索引中的鍵。詳情請參閱「建立 JSON 資料索引」。