בדף הזה מוסבר איך לעבוד עם סוג הנתונים 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 ספרות אחרי הנקודה העשרונית.
- הגודל המקסימלי המותר של פורמט האחסון הנורמלי הוא 10 MB.
- מסמכי
JSONBצריכים להיות מקודדים ב-UTF-8. טרנזקציות או שאילתות עם מסמכי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;
מידע נוסף זמין במאמר בנושא אינדקסים של חיפושי 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. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
תכונות של PostgreSQL JSONB שלא נתמכות
התכונות הבאות של PostgreSQL JSONB בקוד פתוח לא נתמכות ב-Spanner JSONB:
- סדר, השוואה וצבירה
- מפתח ראשי ומפתח זר
- הוספה לאינדקס, כולל אינדקס GIN. במקום זאת, אפשר להשתמש באינדקס חיפוש של Spanner, שמאיץ את אותן פעולות JSONB כמו אינדקס GIN. מידע נוסף זמין במאמר בנושא אינדקס של נתוני JSON.
- שינוי עמודה מסוג
JSONBלכל סוג נתונים אחר או להפך - שימוש בשאילתות עם פרמטרים עם פרמטרים של JSONB לא מוקלדים בכלים שמשתמשים בפרוטוקול PostgreSQL wire
שימוש בהמרת טיפוסים במנוע השאילתות. בניגוד ל-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