בדף הזה מוסבר איך לעבוד עם סוג הנתונים JSONB ב-Spanner.
JSONB הוא סוג נתונים של PostgreSQL שמשמש לאחסון נתונים חצי מובְנים בניב של Spanner PostgreSQL. JSONB מכיל נתונים בפורמט JavaScript Object Notation (JSON), בהתאם למפרט שמתואר ב-RFC 7159.
מפרטים
סוג הנתונים JSONB של Spanner מאחסן ייצוג מנורמל של מסמך הקלט. המשמעות היא:
- מירכאות ורווחים לא נשמרים.
- אין תמיכה בתגובות. עסקאות או שאילתות עם הערות נכשלות.
- מפתחות האובייקטים ממוינים קודם לפי אורך המפתח, ואז לפי יחס סדר מילוני לפי אורך מפתח האובייקט המקביל. אם יש מפתחות אובייקטים כפולים, רק האחרון נשמר.
- סוגים פרימיטיביים (
string,boolean,numberו-null) שומרים על הסוג והערך שלהם.- ערכים מסוג
stringנשמרים בדיוק כמו שהם. - אפסים בסוף המספר נשמרים. פורמט הפלט של ערכים מסוג
numberלא משתמש בכתיב מדעי.
- ערכים מסוג
ערכי
JSONBnullנחשבים לערכים שאינםNULLב-SQL. לדוגמה:SELECT null::jsonb IS NULL; -- Returns true SELECT 'null'::jsonb IS NULL; -- Returns false SELECT '{"a":null}'::jsonb -> 'a' IS NULL; -- Returns false SELECT '{"a":null}'::jsonb -> 'b' IS NULL; -- Returns true SELECT '{"a":null}'::jsonb -> 'a'; -- Returns a JSONB 'null' SELECT '{"a":null}'::jsonb -> 'b'; -- Returns a SQL NULLסדר הרכיבים במערך JSONB נשמר.
הגבלות
ההגבלות הבאות חלות על Spanner JSONB:
- הארגומנטים של הפונקציה
to_jsonbיכולים להיות רק מסוגי הנתונים של PostgreSQL שנתמכים ב-Spanner. - ערכים מסוג מספר יכולים להכיל 4,932 ספרות לפני הנקודה העשרונית ו-16,383 ספרות אחרי הנקודה העשרונית.
- הגודל המקסימלי המותר של פורמט האחסון המנורמל הוא 10MB.
- מסמכי
JSONBצריכים להיות מקודדים ב-UTF-8. טרנזקציות או שאילתות עם מסמכיJSONBשמקודדים בפורמטים אחרים מחזירות שגיאה.
השוואה ומיון
אפשר להשוות בין ערכי JSONB כדי לבדוק אם הם שווים או כדי לסדר אותם. אפשר גם להשתמש בערכי JSONB בסעיפים GROUP BY ו-ORDER BY.
כשמשווים בין ערכי JSONB מסוגים שונים, חלים היחסים הבאים:
Null (JSONB null) < String < Number < Boolean < Array < Object
כשמשווים בין ערכי JSONB מאותו סוג, חלים הכללים הבאים:
- אובייקטים: אובייקטים עם יותר צמדי מפתח/ערך גדולים יותר מאובייקטים עם פחות צמדים. אם לשני האובייקטים יש את אותו מספר של זוגות, הזוגות של מפתח/ערך מושווים בזוגות (קודם המפתחות ואז הערכים) לפי סדר המפתחות שמוגדר במפרט. הזוג הראשון ששונה קובע את הסדר.
- מערכים: מערכים עם יותר רכיבים גדולים יותר ממערכים עם פחות רכיבים. אם לשני המערכים יש את אותו מספר רכיבים, הרכיבים מושווים לפי אינדקס משמאל לימין. האיבר הראשון ששונה קובע את סדר המערך.
- ערכים בוליאניים:
trueגדול מ-false. - מספרים: השוואה מתמטית באמצעות השוואת ערכים מספריים.
- מחרוזות: השוואה לקסיקוגרפית באמצעות כללים סטנדרטיים להשוואת מחרוזות.
ערכי Null ב-JSONB: כל הערכים של
JSONBnullשווים זה לזה וקטנים מכל ערך JSON אחר שאינו null. עם זאת, יש מקרה קצה:מערך ריק ברמה העליונה
[]נחשב קטן יותר מ-JSONB null. מכיוון שההגדרה הזו חלה רק על מערכים ברמה העליונה, ההצהרות הבאות מחזירות את הערך true:'[]'::jsonb < 'null'::jsonb'null'::jsonb < '[[]]'::jsonb'[null]'::jsonb < '[[]]'::jsonb
יצירת טבלה עם עמודות JSONB
אפשר להוסיף עמודת JSONB לטבלה כשיוצרים אותה.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
דוגמה לאובייקט VenueFeatures JSONB:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
הוספה והסרה של עמודות JSONB מטבלאות קיימות
אפשר להוסיף עמודה מסוג JSONB ולהסיר אותה באמצעות הצהרות ALTER, באופן הבא:
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
בדוגמה הבאה מוסבר איך להוסיף עמודת JSONB בשם VenueDetails לטבלה Venues באמצעות ספריות הלקוח של Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
שינוי נתוני JSONB
אפשר לשנות עמודה של JSONB בדיוק כמו כל עמודה אחרת.
לדוגמה:
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
בדוגמה הבאה מוסבר איך לעדכן נתוני JSONB באמצעות ספריות הלקוח של Spanner.
C++
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
C#
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Go
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Java
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Node.js
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
PHP
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Python
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Ruby
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
הוספת נתוני JSON לאינדקס
כדי להאיץ את השאילתות של נתוני JSONB, אתם יכולים להשתמש באינדקסים משניים ובאינדקסי חיפוש עם נתוני ה-JSONB. ב-Spanner אי אפשר להשתמש בעמודות מסוג JSONB כמפתחות באינדקסים משניים.
שימוש באינדקס משני
אינדקסים משניים שימושיים כשמסננים לפי ערכים סקלריים בתוך מסמך JSONB. כדי להשתמש באינדקסים משניים עם JSONB, יוצרים עמודה שנוצרה שמחלצת את נתוני הסקלר הרלוונטיים וממירה אותם לסוג נתונים מתאים של SQL. לאחר מכן תוכלו ליצור אינדקס משני על העמודה שנוצרה. האינדקס מאיץ שאילתות שעומדות בדרישות ופועלות על העמודה שנוצרה.
בדוגמה הבאה, יוצרים אינדקס VenuesByCapacity שבו מסד הנתונים משתמש כדי למצוא את המקומות עם קיבולת גדולה מ-1,000. במקום לבדוק כל שורה, Spanner משתמש באינדקס כדי לאתר את השורות הרלוונטיות, וכך משפר את ביצועי השאילתות, במיוחד בטבלאות גדולות.
ALTER TABLE Venues (
ADD COLUMN VenueCapacity BIGINT GENERATED ALWAYS AS ((VenueFeatures->>'capacity')::BIGINT) VIRTUAL,
DateOpened TIMESTAMPTZ
);
CREATE INDEX VenuesByCapacity ON Venues(VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
שימוש באינדקס החיפוש
אינדקס החיפוש שימושי כששולחים שאילתות למסמכי JSONB דינמיים או מגוונים. בניגוד לאינדקסים משניים, אתם יכולים ליצור אינדקסים של חיפוש בכל מסמך JSONB שמאוחסן בעמודת JSONB. אינדקס החיפוש מתאים את עצמו באופן אוטומטי לשינויים במסמכי JSON, בין שורות שונות ולאורך זמן.
בדוגמה הבאה, אתם יוצרים אינדקס חיפוש ב-VenuesByVenueDetails שבו מסד הנתונים משתמש כדי למצוא את המקומות עם פרטים ספציפיים כמו גודל ולוח זמנים לפעילות. במקום לבדוק כל שורה, Spanner משתמש באינדקס כדי לאתר את השורות הרלוונטיות, וכך משפר את ביצועי השאילתות, במיוחד בטבלאות גדולות.
ALTER TABLE Venues
ADD COLUMN VenueDetails_Tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_jsonb(VenueDetails)) VIRTUAL HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venues (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE VenueDetails @> '{"labels": ["large"], "open": {"Friday": true}}'::jsonb;
SELECT VenueName
FROM Venues
WHERE VenueDetails->'open'->'Friday' = 'true'::jsonb
AND VenueDetails->'type' IN ('"stadium"'::jsonb, '"arena"'::jsonb);
מידע נוסף מופיע במאמר אינדקסי חיפוש ב-JSON.
שליחת שאילתות לנתוני JSONB
אפשר לשלוח שאילתות לעמודות JSONB על סמך הערכים של השדות הבסיסיים. בדוגמה הבאה, הפונקציה מחלצת את VenueId ואת VenueName מ-Venues, כאשר הערך של rating ב-VenueFeatures גדול מ-3.5.
SELECT VenueId, VenueName
FROM Venues
WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
בדוגמה הבאה מוסבר איך לשלוח שאילתות לנתוני JSONB באמצעות ספריות הלקוח של Spanner.
C++
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
C#
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Go
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Java
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Node.js
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
PHP
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Python
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
Ruby
במאמר ספריות הלקוח של Spanner מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-Spanner.
כדי לבצע אימות ב-Spanner, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
תכונות JSONB של PostgreSQL שלא נתמכות
התכונות הבאות של PostgreSQL JSONB בקוד פתוח לא נתמכות ב-Spanner JSONB:
- PrimaryKey ו-ForeignKey
- הוספה לאינדקס, כולל אינדקס GIN. במקום זאת, אתם יכולים להשתמש באינדקס חיפוש של Spanner, שמאיץ את אותן פעולות JSONB כמו אינדקס GIN. מידע נוסף זמין במאמר הוספה של נתוני JSON לאינדקס.
- שינוי עמודה מסוג
JSONBלסוג נתונים אחר, או שינוי עמודה מסוג נתונים אחר לסוג - שימוש בשאילתות עם פרמטרים עם פרמטרים של JSONB ללא סוג בכלים שמשתמשים בפרוטוקול התקשורת של PostgreSQL
שימוש בהמרה במנוע השאילתות. בניגוד ל-PostgreSQL בקוד פתוח, אין תמיכה בהמרה מפורשת מ-
JSONBלטקסט. כדי להתאים לחתימות של פונקציות, צריך להשתמש בהמרה מפורשת מהסוגJSONB. לדוגמה:SELECT concat('abc'::text, '{"key1":1}'::jsonb); -- Returns error SELECT concat('abc'::text, CAST('{"key1":1}'::jsonb AS TEXT)); -- This works SELECT 3 + CAST('5'::jsonb AS INTEGER); -- This works