Questa pagina descrive come utilizzare il tipo di dati JSONB
quando utilizzi Spanner.
JSONB
è un tipo di dati PostgreSQL utilizzato per contenere dati semistrutturati nel dialetto PostgreSQL di Spanner. JSONB
contiene dati
in formato JavaScript Object Notation (JSON), che segue la specifica
descritta in RFC 7159.
Specifiche
Il tipo di dati JSONB
di Spanner memorizza una rappresentazione normalizzata del documento di input. Ciò implica quanto segue:
- Le virgolette e gli spazi vuoti non vengono conservati.
- I commenti non sono supportati. Le transazioni o le query con commenti non vanno a buon fine.
- Le chiavi degli oggetti vengono ordinate prima in base alla lunghezza della chiave e poi in ordine lessicografico in base alla lunghezza equivalente della chiave dell'oggetto. Se sono presenti chiavi oggetto duplicate, viene conservata solo l'ultima.
- I tipi primitivi (
string
,boolean
,number
enull
) mantengono il tipo e il valore.- I valori di tipo
string
vengono conservati esattamente. - Gli zeri finali vengono mantenuti. 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 SQL non-NULL
. 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 essere solo dei tipi di dati PostgreSQL supportati da Spanner. - I valori di tipo Numero possono avere 4932 cifre prima della virgola e 16.383 cifre dopo la virgola.
- La dimensione massima consentita del formato di archiviazione normalizzato è di 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 rilasciarla utilizzando le istruzioni ALTER
nel seguente modo:
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
Il seguente esempio mostra come aggiungere una colonna JSONB
denominata VenueDetails
alla tabella Venues
utilizzando le librerie client Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modificare i dati JSONB
Puoi modificare una colonna JSONB
come qualsiasi altra colonna.
Ecco un esempio:
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
Il seguente esempio mostra come aggiornare i dati JSONB
utilizzando le librerie client Spanner.
C++
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
C#
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Go
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Java
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
PHP
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Python
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Indicizzare i dati JSON
Puoi accelerare le 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 filtrare 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 converte in un tipo di dati SQL appropriato. Puoi quindi creare un indice secondario su questa colonna generata. L'indice accelera le query idonee eseguite sulla colonna generata.
Nell'esempio seguente, crei un indice VenuesByCapacity
che il database utilizza per trovare le sedi con capacità superiore a 1000. Anziché controllare ogni riga, Spanner utilizza l'indice per individuare le righe pertinenti, il che migliora il rendimento delle query, soprattutto 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(VenueCapacity);
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 variabili. A differenza degli indici secondari, puoi creare indici di ricerca su qualsiasi documento JSONB memorizzato in una colonna JSONB. L'indice di ricerca si adatta automaticamente alle variazioni nei documenti JSON, tra le diverse righe e nel tempo.
Nell'esempio seguente, crei un indice di ricerca VenuesByVenueDetails
che
il database utilizza per trovare le sedi 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, soprattutto 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 saperne di più, consulta Indici di ricerca JSON.
Eseguire 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;
Il seguente esempio 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 la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
C#
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Go
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Java
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
PHP
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Python
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta la sezione Librerie client Spanner.
Per eseguire l'autenticazione in Spanner, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura 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. Puoi utilizzare un indice di ricerca Spanner, che accelera le stesse operazioni JSONB di un indice GIN. Per ulteriori 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 tipizzati negli strumenti che utilizzano il protocollo di trasferimento PostgreSQL
Utilizzo della coercizione nel motore di query. A differenza di PostgreSQL open source, la conversione implicita da
JSONB
a testo non è supportata. Devi utilizzare il casting esplicito dal tipoJSONB
per corrispondere alle 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