本頁說明如何使用 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 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
限制
- 您無法在
ORDER BY子句中使用 JSON 資料欄。 - 您無法使用 JSON 類型資料欄做為主鍵,或做為次要索引中的鍵。詳情請參閱「為 JSON 資料建立索引」。