בדף הזה מוסבר איך לעבוד עם JSON באמצעות Spanner.
סוג הנתונים JSON הוא סוג נתונים חצי מובנה שמשמש להחזקת נתוני JSON (JavaScript Object Notation). המפרטים של פורמט JSON מתוארים ב-RFC 7159.
פורמט JSON שימושי להשלמת סכימה יחסית של נתונים דלילים או של נתונים עם מבנה לא מוגדר או משתנה. עם זאת, האופטימיזציה של השאילתות מסתמכת על המודל הרלציוני כדי לסנן, לצרף, לצבור ולמיין ביעילות בקנה מידה נרחב. לשאילתות ב-JSON יהיו פחות אופטימיזציות מובנות ופחות אפשרויות לבדיקה ולכוונון של הביצועים.
מפרטים
הסוג Spanner JSON מאחסן ייצוג מנורמל של מסמך ה-JSON שהוזן.
- אפשר להוסיף עד 80 רמות של קינון ב-JSON.
- הרווחים הלבנים לא נשמרים.
- אין תמיכה בתגובות. טרנזקציות או שאילתות עם הערות ייכשלו.
- האיברים של אובייקט JSON ממוינים לפי סדר לקסיקוגרפי.
- הסדר של רכיבי מערך JSON נשמר.
- אם לאובייקט JSON יש מפתחות כפולים, רק הראשון נשמר.
- הסוג והערך של טיפוסים פרימיטיביים (מחרוזת, ערך בוליאני, מספר ו-null) נשמרים.
- ערכים מסוג מחרוזת נשמרים בדיוק כמו שהם.
- ערכים מסוג מספר נשמרים, אבל יכול להיות שהייצוג הטקסטואלי שלהם ישתנה כתוצאה מתהליך הנרמול. לדוגמה, המספר 10000 יכול להיות מיוצג באופן מנורמל כ-1e+4. הסמנטיקה של שמירת ערכים מספריים היא כדלקמן:
- מספרים שלמים חתומים בטווח [INT64_MIN, INT64_MAX] נשמרים.
- מספרים שלמים לא מסומנים בטווח [0, UINT64_MAX] נשמרים.
- ערכים מסוג Double שאפשר להמיר ממחרוזת ל-Double ואז למחרוזת בלי לאבד את הדיוק העשרוני נשמרים. אם לא ניתן לבצע round trip של ערך double באופן הזה, העסקה או השאילתה ייכשלו.
- לדוגמה,
SELECT JSON '2.2412421353246235436'נכשל. - פתרון עקיף שפועל הוא
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round'), שמחזיר את הערךJSON '2.2412421353246237'.
- לדוגמה,
- משתמשים בפונקציות
TO_JSON(),JSON_OBJECT()ו-JSON_ARRAY()כדי ליצור מסמכי JSON ב-SQL. הפונקציות האלה מטמיעות את המירכאות הנדרשות ואת התווים שצריך להוסיף כדי למנוע בעיות.
הגודל המקסימלי המותר של המסמך המנורמל הוא 10MB.
מאפיין המציין אם ערך יכול להיות ריק (nullability)
ערכי 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 יכולים להיות null.
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 לאינדקס.