本頁說明如何使用 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 非空值。
例如:
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}}');
詳情請參閱「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 資料建立索引」。