Questa pagina descrive come utilizzare il tipo di dati JSONB
quando utilizzi Spanner.
JSONB
è un tipo di dati PostgreSQL utilizzato per memorizzare dati semistrutturati nel dialetto PostgreSQL di Spanner. JSONB
contiene i dati
in formato JSON (JavaScript Object Notation), che segue la specifica
descritta in RFC 7159.
Specifiche
Il tipo di dati Spanner JSONB
memorizza una rappresentazione normalizzata del
documento di input. Ciò implica quanto segue:
- Le virgolette e i caratteri di spazio vuoto non vengono conservati.
- I commenti non sono supportati. Le transazioni o le query con commenti non vanno a buon fine.
- Le chiavi dell'oggetto vengono ordinate prima in base alla lunghezza della chiave e poi in ordine lessicografico in base alla lunghezza della chiave dell'oggetto equivalente. Se sono presenti chiavi di oggetti duplicate, viene conservata solo l'ultima.
- I tipi primitivi (
string
,boolean
,number
enull
) mantengono inalterati il tipo e il valore.- I valori di tipo
string
vengono conservati esattamente. - I zeri finali vengono conservati. Il formato di output per i valori di tipo
number
non utilizza la notazione scientifica.
- I valori di tipo
I valori
JSONB
null
vengono trattati come nonNULL
in SQL. Ad esempio: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
L'ordine degli elementi dell'array JSONB viene mantenuto.
Limitazioni
Con Spanner JSONB
si applicano le seguenti limitazioni:
- Gli argomenti della funzione
to_jsonb
possono provenire solo dai tipi di dati PostgreSQL supportati da Spanner. - I valori di tipo numerico possono avere 4932 cifre prima del separatore decimale e 16383 cifre dopo il separatore decimale.
- La dimensione massima consentita del formato di archiviazione normalizzato è 10 MB.
- I documenti
JSONB
devono essere codificati in UTF-8. Le transazioni o le query con documentiJSONB
codificati in altri formati restituiscono un errore.
Creare una tabella con colonne JSONB
Puoi aggiungere una colonna JSONB
a una tabella quando la crei.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
Di seguito è riportato un esempio di oggetto VenueFeatures
JSONB
:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
Aggiungere e rimuovere colonne JSONB dalle tabelle esistenti
Puoi aggiungere una colonna JSONB
e inserirla utilizzando le istruzioni ALTER
come segue:
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
L'esempio seguente mostra come aggiungere una colonna JSONB
denominata VenueDetails
alla tabella Venues
utilizzando le librerie client Spanner.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Modificare i dati JSONB
Puoi modificare una colonna JSONB
come qualsiasi altra colonna.
Di seguito è riportato un esempio:
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
L'esempio seguente mostra come aggiornare i dati JSONB
utilizzando le librerie client Spanner.
C++
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
C#
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Go
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Java
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
PHP
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Python
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Dati JSON dell'indice
Puoi accelerare l'esecuzione di query sui dati JSONB utilizzando indici secondari e indici di ricerca con i tuoi dati JSONB. Spanner non supporta l'utilizzo di colonne di tipo JSONB come chiavi negli indici secondari.
Utilizzare l'indice secondario
Gli indici secondari sono utili per applicare filtri in base a valori scalari all'interno di un documento JSONB. Per utilizzare gli indici secondari con JSONB, crea una colonna generata che estrae i dati scalari pertinenti e li esegue in un tipo di dato SQL appropriato. Poi puoi creare un indice secondario su questa colonna generata. L'indice accelera le query idonee eseguite sulla colonna generata.
Nell'esempio seguente viene creato un indice VenuesByCapacity
utilizzato dal database per trovare i luoghi con una capacità superiore a 1000. Anziché controllare ogni riga, Spanner utilizza l'indice per individuare le righe pertinenti, il che migliora le prestazioni delle query, in particolare per le tabelle di grandi dimensioni.
ALTER TABLE Venues (
ADD COLUMN VenueCapacity BIGINT GENERATED ALWAYS AS ((VenueFeatures->>'capacity')::BIGINT) VIRTUAL,
DateOpened TIMESTAMPTZ
);
CREATE INDEX VenuesByCapacity ON Venues(TotalCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
Utilizzare gli indici di ricerca
Gli indici di ricerca sono utili quando esegui query su documenti JSONB dinamici o diversi. A differenza degli indici secondari, puoi creare indici di ricerca su qualsiasi documento JSONB archiviato in una colonna JSONB. L'indice di ricerca si adatta automaticamente alle variazioni tra i documenti JSON, tra righe diverse e nel tempo.
Nell'esempio seguente viene creato un indice di ricerca VenuesByVenueDetails
utilizzato dal database per trovare i luoghi con dettagli specifici, come dimensioni e orario di apertura. Anziché controllare ogni riga, Spanner utilizza l'indice per individuare le righe pertinenti, il che migliora le prestazioni delle query, in particolare per le tabelle di grandi dimensioni.
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;
Per ulteriori informazioni, consulta Indici di ricerca JSON.
Esegui query sui dati JSONB
Puoi eseguire query sulle colonne JSONB
in base ai valori dei campi sottostanti. L'esempio seguente estrae VenueId
e VenueName
da Venues
dove VenueFeatures
ha un valore rating
maggiore di 3.5
.
SELECT VenueId, VenueName
FROM Venues
WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
L'esempio seguente mostra come eseguire query sui dati JSONB
utilizzando
le librerie client Spanner.
C++
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
C#
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Go
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Java
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
PHP
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Python
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Funzionalità JSONB di PostgreSQL non supportate
Le seguenti funzionalità di PostgreSQL JSONB
open source non sono supportate su
Spanner JSONB
:
- Ordinamento, confronto e aggregazione
- PrimaryKey e ForeignKey
- Indicizzazione, incluso l'indice GIN. In alternativa, puoi utilizzare un indice di ricerca Spanner, che accelera le stesse operazioni JSONB di un indice GIN. Per maggiori informazioni, consulta Indicizzare i dati JSON.
- Modifica di una colonna
JSONB
in o da qualsiasi altro tipo di dati - Utilizzo di query con parametri con parametri JSONB non tipi negli strumenti che utilizzano il protocollo di comunicazione PostgreSQL
Utilizzo della coercizione nel motore di query. A differenza di PostgreSQL open source, la coercizione implicita da
JSONB
a testo non è supportata. Devi utilizzare il trasferimento esplicito dal tipoJSONB
per abbinare le firme delle funzioni. Ad esempio: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