Auf dieser Seite wird beschrieben, wie Sie mit dem Datentyp JSONB arbeiten, wenn Sie Spanner verwenden.
JSONB ist ein PostgreSQL-Datentyp, der im Spanner-PostgreSQL-Dialekt zum Speichern semistrukturierter Daten verwendet wird. JSONB enthält Daten im JSON-Format (JavaScript Object Notation), das der in RFC 7159 beschriebenen Spezifikation entspricht.
Spezifikationen
Der Spanner-Datentyp JSONB speichert eine normalisierte Darstellung des Eingabedokuments. Das bedeutet Folgendes:
- Anführungszeichen und Leerzeichen werden nicht beibehalten.
- Kommentare werden nicht unterstützt. Transaktionen oder Abfragen mit Kommentaren schlagen fehl.
- Objektschlüssel werden zuerst nach Schlüssellänge und dann lexikografisch nach der entsprechenden Objektschlüssellänge sortiert. Wenn es doppelte Objektschlüssel gibt, wird nur der letzte beibehalten.
- Bei einfachen Typen (
string,boolean,numberundnull) bleiben Typ und Wert erhalten.- Werte vom Typ
stringwerden exakt beibehalten. - Nachgestellte Nullen bleiben erhalten. Das Ausgabeformat für Werte vom Typ
numberverwendet keine wissenschaftliche Notation.
- Werte vom Typ
JSONB-null-Werte werden als SQL-Nicht-NULLbehandelt. Beispiel: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 NULLDie Reihenfolge der JSONB-Array-Elemente bleibt erhalten.
Beschränkungen
Für Spanner JSONB gelten die folgenden Einschränkungen:
- Argumente für die Funktion
to_jsonbkönnen nur von den PostgreSQL-Datentypen stammen, die von Spanner unterstützt werden. - Werte vom Typ „Number“ können 4.932 Ziffern vor dem Dezimaltrennzeichen und 16.383 Ziffern nach dem Dezimaltrennzeichen haben.
- Die maximal zulässige Größe des normalisierten Speicherformats beträgt 10 MB.
JSONB-Dokumente müssen UTF-8-codiert sein. Bei Transaktionen oder Abfragen mitJSONB-Dokumenten, die in anderen Formaten codiert sind, wird ein Fehler zurückgegeben.
Vergleich und Sortierung
Sie können JSONB-Werte auf Gleichheit und Reihenfolge vergleichen. Sie können JSONB-Werte auch in einer GROUP BY- und ORDER BY-Klausel verwenden.
Beim Vergleich von JSONB-Werten unterschiedlicher Typen gelten die folgenden Beziehungen:
Null (JSONB null) < String < Number < Boolean < Array < Object
Beim Vergleich von JSONB-Werten desselben Typs gelten die folgenden Regeln:
- Objekte: Objekte mit mehr Schlüssel/Wert-Paaren sind größer als Objekte mit weniger Paaren. Wenn beide Objekte die gleiche Anzahl von Paaren haben, werden ihre Schlüssel/Wert-Paare paarweise (zuerst Schlüssel, dann Werte) in der in den Spezifikationen definierten Schlüsselreihenfolge verglichen. Das erste Paar, das sich unterscheidet, bestimmt die Reihenfolge.
- Arrays: Arrays mit mehr Elementen sind größer als Arrays mit weniger Elementen. Wenn beide Arrays dieselbe Anzahl von Elementen haben, werden die Elemente von links nach rechts Index für Index verglichen. Das erste abweichende Element bestimmt die Array-Reihenfolge.
- Boolesche Werte:
trueist größer alsfalse. - Zahlen: Mathematischer Vergleich anhand von numerischen Werten.
- Strings: Werden lexikografisch anhand von Standardregeln für den Stringvergleich verglichen.
JSONB-Nullwerte: Alle
JSONB-null-Werte sind gleich und kleiner als alle anderen JSON-Werte, die nicht null sind. Es gibt jedoch einen Grenzfall:Ein leeres Array der obersten Ebene
[]wird als kleiner als ein JSONB-Nullwert betrachtet. Da dies nur für Arrays der obersten Ebene gilt, geben die folgenden Anweisungen „true“ zurück:'[]'::jsonb < 'null'::jsonb'null'::jsonb < '[[]]'::jsonb'[null]'::jsonb < '[[]]'::jsonb
Tabelle mit JSONB-Spalten erstellen
Sie können einer Tabelle beim Erstellen eine JSONB-Spalte hinzufügen.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
Hier ein Beispiel für ein VenueFeatures-JSONB-Objekt:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
JSONB-Spalten zu vorhandenen Tabellen hinzufügen und daraus entfernen
Sie können eine JSONB-Spalte hinzufügen und mit ALTER-Anweisungen so löschen:
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
Im folgenden Beispiel wird gezeigt, wie Sie mithilfe von Spanner-Clientbibliotheken eine JSONB-Spalte mit dem Namen VenueDetails zur Tabelle Venues hinzufügen.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
JSONB-Daten ändern
Sie können eine JSONB-Spalte wie jede andere Spalte ändern.
Hier ein Beispiel:
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
Im folgenden Beispiel wird gezeigt, wie Sie JSONB-Daten mithilfe von Spanner-Clientbibliotheken aktualisieren.
C++
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
C#
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Go
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Java
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Node.js
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
PHP
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Python
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Ruby
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
JSON-Daten indexieren
Sie können die Abfrage von JSONB-Daten beschleunigen, indem Sie sekundäre Indexe und Suchindexe mit Ihren JSONB-Daten verwenden. Spanner unterstützt die Verwendung von JSONB-Spalten als Schlüssel in sekundären Indexen nicht.
Sekundären Index verwenden
Sekundäre Indexe sind nützlich, wenn Sie nach skalaren Werten in einem JSONB-Dokument filtern. Wenn Sie sekundäre Indexe mit JSONB verwenden möchten, erstellen Sie eine generierte Spalte, die die relevanten skalaren Daten extrahiert und in einen geeigneten SQL-Datentyp umwandelt. Anschließend können Sie einen sekundären Index für diese generierte Spalte erstellen. Der Index beschleunigt zulässige Abfragen, die für die generierte Spalte ausgeführt werden.
Im folgenden Beispiel erstellen Sie einen VenuesByCapacity-Index, mit dem die Datenbank die Veranstaltungsorte mit einer Kapazität von mehr als 1.000 findet. Anstatt jede Zeile zu prüfen, verwendet Spanner den Index, um die relevanten Zeilen zu finden. Dadurch wird die Abfrageleistung verbessert, insbesondere bei großen Tabellen.
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;
Suchindexe verwenden
Suchindexe sind nützlich, wenn Sie Abfragen für JSONB-Dokumente ausführen, die dynamisch oder unterschiedlich sind. Im Gegensatz zu sekundären Indexen können Sie Suchindexe für jedes JSONB-Dokument erstellen, das in einer JSONB-Spalte gespeichert ist. Der Suchindex passt sich automatisch an Variationen in JSON-Dokumenten, zwischen verschiedenen Zeilen und im Laufe der Zeit an.
Im folgenden Beispiel erstellen Sie einen VenuesByVenueDetails-Suchindex, mit dem die Datenbank Veranstaltungsorte mit bestimmten Details wie Größe und Betriebszeiten findet. Anstatt jede Zeile zu prüfen, verwendet Spanner den Index, um die relevanten Zeilen zu finden. Das verbessert die Abfrageleistung, insbesondere bei großen Tabellen.
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);
Weitere Informationen finden Sie unter JSON-Suchindexe.
JSONB-Daten abfragen
Sie können JSONB-Spalten anhand der Werte der zugrunde liegenden Felder abfragen. Im folgenden Beispiel werden VenueId und VenueName aus Venues extrahiert, wobei VenueFeatures einen rating-Wert größer als 3.5 hat.
SELECT VenueId, VenueName
FROM Venues
WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
Im folgenden Beispiel wird gezeigt, wie Sie JSONB-Daten mithilfe von Spanner-Clientbibliotheken abfragen.
C++
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
C#
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Go
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Java
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Node.js
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
PHP
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Python
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Ruby
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Spanner finden Sie unter Cloud Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Cloud Spanner die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Nicht unterstützte PostgreSQL-JSONB-Funktionen
Die folgenden Open-Source-PostgreSQL-JSONB-Features werden in Spanner JSONB nicht unterstützt:
- PrimaryKey und ForeignKey
- Indexierung, einschließlich des GIN-Index. Sie können stattdessen einen Spanner-Suchindex verwenden, der dieselben JSONB-Vorgänge wie ein GIN-Index beschleunigt. Weitere Informationen finden Sie unter JSON-Daten indexieren.
- Ändern einer
JSONB-Spalte in einen anderen Datentyp oder umgekehrt - Parametrisierte Abfragen mit nicht typisierten JSONB-Parametern in Tools verwenden, die das PostgreSQL-Wire-Protokoll verwenden
Verwendung der impliziten Umwandlung in der Abfrage-Engine. Im Gegensatz zu Open-Source-PostgreSQL wird die implizite Umwandlung von
JSONBin Text nicht unterstützt. Sie müssen eine explizite Umwandlung vom TypJSONBverwenden, um Funktionssignaturen abzugleichen. Beispiel: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