Auf dieser Seite wird beschrieben, wie Sie mit dem Datentyp JSONB
in Spanner arbeiten.
JSONB
ist ein PostgreSQL-Datentyp, der zum Speichern semistrukturierter Daten im Spanner-PostgreSQL-Dialekt 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
,number
undnull
) werden Typ und Wert beibehalten.- Werte vom Typ
string
werden genau beibehalten. - Nachgestellte Nullen werden beibehalten. Für Werte vom Typ
number
wird im Ausgabeformat keine wissenschaftliche Notation verwendet.
- Werte vom Typ
JSONB
-null
-Werte werden als SQL-Nicht-NULL
behandelt. 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 NULL
Die Reihenfolge der JSONB-Arrayelemente wird beibehalten.
Beschränkungen
Für Spanner JSONB
gelten die folgenden Einschränkungen:
- Argumente für die Funktion
to_jsonb
können nur aus den PostgreSQL-Datentypen stammen, die von Spanner unterstützt werden. - Werte vom Typ „Zahl“ können 4.932 Ziffern vor dem Dezimalpunkt und 16.383 Ziffern nach dem Dezimalpunkt haben.
- Die maximal zulässige Größe des normalisierten Speicherformats beträgt 10 MB.
JSONB
-Dokumente müssen in UTF-8 codiert sein. Transaktionen oder Abfragen mitJSONB
-Dokumenten, die in anderen Formaten codiert sind, geben einen Fehler zurück.
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 sie mit ALTER
-Anweisungen wie folgt entfernen:
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
Im folgenden Beispiel wird gezeigt, wie eine JSONB
-Spalte namens VenueDetails
zur Venues
-Tabelle mithilfe der Spanner-Clientbibliotheken hinzugefügt wird.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
JSONB-Daten ändern
Sie können eine JSONB
-Spalte wie jede andere Spalte ändern.
Ein Beispiel:
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
Das folgende Beispiel zeigt, wie JSONB
-Daten mit den Spanner-Clientbibliotheken aktualisiert werden.
C++
Informationen zum Installieren und Verwenden der Clientbibliothek für Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
JSON-Daten indexieren
Sie können das Abfragen von JSONB-Daten beschleunigen, indem Sie sekundäre Indizes und Suchindizes für Ihre JSONB-Daten verwenden. Spanner unterstützt nicht die Verwendung von Spalten des Typs JSONB als Schlüssel in sekundären Indexen.
Sekundären Index verwenden
Sekundärindexe sind nützlich, wenn Sie nach Skalarwerten in einem JSONB-Dokument filtern. Wenn Sie sekundäre Indexe mit JSONB verwenden möchten, erstellen Sie eine generierte Spalte, in der die relevanten skalaren Daten extrahiert und in einen geeigneten SQL-Datentyp umgewandelt werden. Anschließend können Sie einen sekundären Index für diese generierte Spalte erstellen. Der Index beschleunigt geeignete Abfragen, die für die generierte Spalte ausgeführt werden.
Im folgenden Beispiel erstellen Sie einen VenuesByCapacity
-Index, den die Datenbank verwendet, um die Veranstaltungsorte mit einer Kapazität von mehr als 1.000 zu finden. 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 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 dynamische oder unterschiedliche JSONB-Dokumente ausführen. 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 Zeitverlauf an.
Im folgenden Beispiel erstellen Sie einen VenuesByVenueDetails
-Suchindex, mit dem die Datenbank nach Veranstaltungsorten mit bestimmten Details wie Größe und Betriebszeiten sucht. 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 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;
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;
Das folgende Beispiel zeigt, wie JSONB
-Daten mit den Spanner-Clientbibliotheken abgefragt werden.
C++
Informationen zum Installieren und Verwenden der Clientbibliothek für Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner 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 Spanner finden Sie unter Spanner-Clientbibliotheken.
Richten Sie zur Authentifizierung bei Spanner Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Nicht unterstützte JSONB-Features von PostgreSQL
Die folgenden Open-Source-PostgreSQL-JSONB
-Funktionen werden in Spanner JSONB
nicht unterstützt:
- Sortierung, Vergleich und Aggregation
- PrimaryKey und ForeignKey
- Indexierung, einschließlich des GIN-Index. Stattdessen können Sie 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
Typumwandlung in der Abfrage-Engine verwenden Im Gegensatz zu Open-Source-PostgreSQL wird die implizite Typumwandlung von
JSONB
in Text nicht unterstützt. Sie müssen explizit vom TypJSONB
umwandeln, 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