Auf dieser Seite wird beschrieben, wie Sie mit JSON in Spanner arbeiten.
Der JSON-Datentyp ist ein semistrukturierter Datentyp, der zum Speichern von JSON-Daten (JavaScript Object Notation) verwendet wird. Die Spezifikationen für das JSON-Format werden in RFC 7159 beschrieben.
JSON ist nützlich, um ein relationales Schema für Daten zu ergänzen, die dünnbesetzt oder eine lose definierte oder sich ändernde Struktur haben. Das Abfrageoptimierungstool stützt sich jedoch auf das relationale Modell, um in großem Maßstab effizient zu filtern, zu joinen, zu aggregieren und zu sortieren. Abfragen über JSON haben weniger integrierte Optimierungen und weniger Kosten, um die Leistung zu prüfen und zu optimieren.
Spezifikationen
Im Spanner-JSON-Typ wird eine normalisierte Darstellung des eingegebenen JSON-Dokuments gespeichert.
- JSON kann bis zu 80 Ebenen verschachtelt werden.
- Leerzeichen bleiben nicht erhalten.
- Kommentare werden nicht unterstützt. Transaktionen oder Abfragen mit Kommentaren schlagen fehl.
- Mitglieder eines JSON-Objekts werden lexikografisch sortiert.
- Die Reihenfolge der JSON-Arrayelemente wird beibehalten.
- Wenn ein JSON-Objekt Schlüsselduplikate hat, wird nur der erste beibehalten.
- Bei einfachen Typen (String, boolesch, Zahl und Null) werden Typ und Wert beibehalten.
- Die Werte der Stringtypen werden genau beibehalten.
- Zahlentypwerte bleiben erhalten, ihre Textdarstellung kann sich jedoch aufgrund des Normalisierungsprozesses jedoch ändern. Zum Beispiel kann eine Eingabenummer von 10.000 eine normalisierte Darstellung von 1e+4 haben. Folgendes ist die Semantik für die Beibehaltung der Zahl:
- Signierte Ganzzahlen im Bereich von [INT64_MIN, INT64_MAX] bleiben erhalten.
- Vorzeichenlose Ganzzahlen im Bereich von [0, UINT64_MAX] bleiben erhalten.
- Double-Werte, die ohne Verlust der Dezimalgenauigkeit von String zu Double zu String konvertiert werden können, bleiben erhalten. Wenn ein Double-Wert nicht auf diese Weise hin- und her konvertiert werden kann, schlägt die Transaktion oder Abfrage fehl.
- Beispiel:
SELECT JSON '2.2412421353246235436'schlägt fehl. - Eine funktionale Problemumgehung ist
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round'), dieJSON '2.2412421353246237'zurückgibt.
- Beispiel:
- Verwenden Sie die Funktionen
TO_JSON(),JSON_OBJECT()undJSON_ARRAY(), um JSON-Dokumente in SQL zu erstellen. Diese Funktionen implementieren die erforderlichen Anführungszeichen und Escape-Zeichen.
Die maximal zulässige Größe des normalisierten Dokuments beträgt 10 MB.
Null-Zulässigkeit
JSON-null-Werte werden als SQL-Nicht-NULL behandelt.
Beispiel:
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
Codierung
JSON-Dokumente müssen in UTF-8 codiert sein. Transaktionen oder Abfragen mit JSON-Dokumenten, die in anderen Formaten codiert sind, geben einen Fehler zurück.
Tabelle mit JSON-Spalten erstellen
Eine JSON-Spalte kann beim Erstellen der Tabelle hinzugefügt werden. JSON-Typwerte können null sein.
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
JSON-Spalten zu vorhandenen Tabellen hinzufügen und daraus entfernen
Eine JSON-Spalte kann auch einer vorhandenen Tabelle hinzugefügt und daraus entfernt werden.
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
Im folgenden Beispiel wird gezeigt, wie Sie der Tabelle Venues mithilfe der gcloud CLI und der Spanner-Clientbibliotheken eine JSON-Spalte mit dem Namen VenueDetails hinzufügen.
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-Daten ändern
Im folgenden Beispiel wird gezeigt, wie Sie JSON-Daten mithilfe der gcloud CLI und der Spanner-Clientbibliotheken aktualisieren.
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++
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#
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
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
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
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
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
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
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 JSON-Daten beschleunigen, indem Sie sekundäre Indexe und Suchindexe mit Ihren JSON-Daten verwenden. Cloud Spanner unterstützt die Verwendung von JSON-Spalten als Schlüssel in sekundären Indexen nicht.
Sekundären Index verwenden
Sekundärindexe sind nützlich, wenn Sie nach skalaren Werten in einem JSON-Dokument filtern. Wenn Sie sekundäre Indexe mit JSON verwenden möchten, erstellen Sie eine generierte Spalte, in der die relevanten skalaren Daten extrahiert und in einen geeigneten SQL-Typ konvertiert werden. 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 INT64 AS (INT64(VenueDetails.capacity));
CREATE INDEX VenuesByCapacity ON Venue (VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
Suchindexe verwenden
Suchindizes sind nützlich, wenn Sie Abfragen für dynamische oder unterschiedliche JSON-Dokumente ausführen. Im Gegensatz zu sekundären Indexen können Sie Suchindexe für jedes JSON-Dokument erstellen, das in einer JSON-Spalte gespeichert ist. Der Suchindex wird automatisch an Variationen in JSON-Dokumenten, zwischen verschiedenen Zeilen und im Zeitverlauf angepasst.
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. Das verbessert die Abfrageleistung, insbesondere bei großen Tabellen.
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");
Weitere Informationen finden Sie unter JSON-Suchindizes.
JSON-Daten abfragen
Im folgenden Beispiel wird gezeigt, wie Sie JSON-Daten mit der gcloud CLI und den Spanner-Clientbibliotheken abfragen.
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++
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#
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
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
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
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
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
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
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.
Vergleich und Sortierung
Sie können JSON-Werte auf Gleichheit und Reihenfolge vergleichen. Sie können JSON-Werte auch in GROUP BY- und ORDER BY-Klauseln verwenden. Wenn Sie Gleichheitsvergleiche für JSON-Spalten oder deren Unterpfade in schreibgeschützten Transaktionen beschleunigen möchten, können Sie einen Suchindex verwenden.
Ausführliche Regeln und Semantik finden Sie unter JSON-Vergleich und -Sortierung.
Beschränkungen
- Spalten vom Typ „JSON“ können nicht als Primärschlüssel oder als Schlüssel in sekundären Indexen verwendet werden. Weitere Informationen finden Sie unter JSON-Daten indexieren.
Nächste Schritte
- JSON-Datentyp
- JSON-Funktionen
- JSON-Operatoren: