בדף הזה מוסבר איך לעבוד עם JSON באמצעות Spanner.
סוג הנתונים JSON הוא סוג נתונים חצי מובנה שמשמש לשמירת נתוני JSON (JavaScript Object Notation). המפרטים של פורמט JSON מתוארים ב-RFC 7159.
JSON שימושי להשלמת סכימה יחסית לנתונים חסכוניים (sparse) או לנתונים עם מבנה שמוגדר באופן רופף או משתנה. עם זאת, הכלי לאופטימיזציה של שאילתות מסתמך על המודל הרלציוני כדי לסנן, לאחד, לצבור ולמיין ביעילות בקנה מידה נרחב. בשאילתות על JSON יהיו פחות אופטימיזציות מובנות ופחות אפשרויות לבדוק ולכוונן את הביצועים.
מפרטים
הסוג Spanner JSON מאחסן ייצוג מנורמל של מסמך ה-JSON שהוזן.
- אפשר להוסיף עד 80 רמות היררכיה של JSON.
- הרווחים הלבנים לא נשמרים.
- אין תמיכה בתגובות. טרנזקציות או שאילתות עם הערות ייכשלו.
- האיברים של אובייקט JSON ממוינים לפי סדר לקסיקוגרפי.
- הסדר של רכיבי מערך JSON נשמר.
- אם לאובייקט JSON יש מפתחות כפולים, רק הראשון נשמר.
- הסוג והערך של טיפוסים פרימיטיביים (מחרוזת, ערך בוליאני, מספר ו-null) נשמרים.
- ערכים מסוג מחרוזת נשמרים בדיוק כמו שהם.
- ערכים מסוג מספר נשמרים, אבל הייצוג הטקסטואלי שלהם עשוי להשתנות כתוצאה מתהליך הנורמליזציה. לדוגמה, המספר 10000 יכול להיות מיוצג באופן מנורמל כ-1e+4. הסמנטיקה של שמירת הערכים המספריים היא:
- מספרים שלמים עם סימן בטווח [INT64_MIN, INT64_MAX] נשמרים.
- מספרים שלמים לא חתומים בטווח [0, UINT64_MAX] נשמרים.
- ערכים מסוג Double שאפשר להמיר ממחרוזת ל-Double ואז למחרוזת בלי לאבד את הדיוק העשרוני נשמרים. אם אי אפשר להמיר ערך מסוג double הלוך ושוב באופן הזה, העסקה או השאילתה נכשלות.
- לדוגמה,
SELECT JSON '2.2412421353246235436'נכשל. - פתרון עקיף שעובד הוא
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round'), שמחזיר את הערךJSON '2.2412421353246237'.
- לדוגמה,
- כדי ליצור מסמכי JSON ב-SQL, משתמשים בפונקציות
TO_JSON(),JSON_OBJECT()ו-JSON_ARRAY(). הפונקציות האלה מטמיעות את התווים הנחוצים להוספת מירכאות ותווי בריחה (escape).
הגודל המקסימלי המותר של המסמך המנורמל הוא 10MB.
מאפיין המציין אם ערך יכול להיות ריק (nullability)
ערכי null ב-JSON נחשבים לערכי non-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 יכולים להיות ניתנים לאיפוס (nullable).
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;
בדוגמה הבאה אפשר לראות איך מוסיפים עמודת JSON בשם VenueDetails לטבלה Venues באמצעות ה-CLI של gcloud וספריות הלקוח של Spanner.
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
Ruby
שינוי נתוני JSON
בדוגמה הבאה מוסבר איך לעדכן נתונים ב-JSON באמצעות ה-CLI של gcloud וספריות הלקוח של Spanner.
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, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
C#
C#
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
המשך
Go
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Java
Java
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Node.js
Node.js
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
PHP
PHP
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Python
Python
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Ruby
Ruby
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
הוספת נתוני JSON לאינדקס
כדי להאיץ את השאילתות של נתוני JSON, אתם יכולים להשתמש באינדקסים משניים ובאינדקסי חיפוש עם נתוני ה-JSON. ב-Spanner אי אפשר להשתמש בעמודות מסוג JSON כמפתחות באינדקסים משניים.
שימוש באינדקס משני
אינדקסים משניים שימושיים כשמסננים לפי ערכים סקלריים במסמך JSON. כדי להשתמש באינדקסים משניים עם JSON, יוצרים עמודה שנוצרה שמחלצת את הנתונים הסקלריים הרלוונטיים וממירים את הנתונים לסוג SQL מתאים. לאחר מכן תוכלו ליצור אינדקס משני על העמודה שנוצרה. האינדקס מאיץ שאילתות מתאימות שפועלות על העמודה שנוצרה.
בדוגמה הבאה, יוצרים אינדקס VenuesByCapacity שבו מסד הנתונים משתמש כדי למצוא את המקומות עם קיבולת גדולה מ-1,000. במקום לבדוק כל שורה, 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
בדוגמה הבאה מוסבר איך לשלוח שאילתה לנתוני JSON באמצעות ה-CLI של gcloud וספריות הלקוח של Spanner.
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, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
C#
C#
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
המשך
Go
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Java
Java
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Node.js
Node.js
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
PHP
PHP
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Python
Python
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Ruby
Ruby
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
השוואה ומיון
אפשר להשוות בין ערכי JSON כדי לבדוק אם הם שווים או כדי לסדר אותם. אפשר גם להשתמש בערכי JSON בסעיפים GROUP BY ו-ORDER BY. כדי להאיץ השוואות שוויון בעמודות JSON או בנתיבי המשנה שלהן בעסקאות לקריאה בלבד, אפשר להשתמש באינדקס חיפוש.
לכללים ולסמנטיקה מפורטים, ראו השוואה ומיון של JSON.
הגבלות
- אי אפשר להשתמש בעמודות מסוג JSON כמפתחות ראשיים או כמפתחות באינדקסים משניים. מידע נוסף זמין במאמר הוספה של נתוני JSON לאינדקס.