Esta página descreve como trabalhar com o tipo de dados JSONB
ao usar o Spanner.
JSONB
é um tipo de dados do PostgreSQL usado para armazenar dados semiestruturados
no dialeto do PostgreSQL do Spanner. JSONB
armazena dados
no formato JavaScript Object Notation (JSON), que segue a especificação
descrita em RFC 7159.
Especificações
O tipo de dados JSONB
do Spanner armazena uma representação normalizada do
documento de entrada. Isso implica o seguinte:
- As aspas e os caracteres de espaço em branco não são preservados.
- Não é possível usar comentários. Transações ou consultas com comentários falham.
- As chaves de objetos são classificadas primeiro pela comprimento da chave e, em seguida, lexicograficamente pelo comprimento equivalente da chave do objeto. Se houver chaves de objeto duplicadas, apenas a última será preservada.
- O tipo e o valor de tipos primitivos (
string
,boolean
,number
enull
) são preservados.- Os valores do tipo
string
são preservados exatamente. - Os zeros finais são preservados. O formato de saída para valores do tipo
number
não usa notação científica.
- Os valores do tipo
Os valores
null
JSONB
são tratados como SQL nãoNULL
. Por exemplo: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
A ordem dos elementos da matriz JSONB é preservada.
Restrições
As seguintes restrições se aplicam ao Spanner JSONB
:
- Os argumentos da função
to_jsonb
só podem ser dos tipos de dados do PostgreSQL com suporte ao Spanner. - Os valores do tipo numérico podem ter 4.932 dígitos antes do ponto decimal e 16.383 dígitos depois do ponto decimal.
- O tamanho máximo permitido do formato de armazenamento normalizado é 10 MB.
- Os documentos
JSONB
precisam ser codificados em UTF-8. Transações ou consultas com documentosJSONB
codificados em outros formatos retornam um erro.
Criar uma tabela com colunas JSONB
É possível adicionar uma coluna JSONB
a uma tabela durante a criação.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
Confira um exemplo de objeto JSONB
VenueFeatures
:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
Adicionar e remover colunas JSONB de tabelas atuais
É possível adicionar e excluir uma coluna JSONB
usando instruções ALTER
da seguinte maneira:
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
O exemplo a seguir mostra como adicionar uma coluna JSONB
chamada VenueDetails
à
tabela Venues
usando as bibliotecas de cliente do Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modificar dados JSONB
É possível modificar uma coluna JSONB
como qualquer outra.
Confira um exemplo:
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
O exemplo a seguir mostra como atualizar dados JSONB
usando
bibliotecas de cliente do Spanner.
C++
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
C#
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Go
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Java
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Node.js
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
PHP
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Python
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Ruby
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Índice de dados JSON
É possível acelerar a consulta de dados JSONB usando índices secundários e índices de pesquisa com seus dados JSONB. O Spanner não oferece suporte ao uso de colunas do tipo JSONB como chaves em índices secundários.
Usar índice secundário
Os índices secundários são úteis ao filtrar valores escalares em um documento JSONB. Para usar índices secundários com JSONB, crie uma coluna gerada que extrai os dados escalares relevantes e os converte em um tipo de dados SQL adequado. Em seguida, é possível criar um índice secundário nessa coluna gerada. O índice acelera consultas qualificadas que são executadas na coluna gerada.
No exemplo a seguir, você cria um índice VenuesByCapacity
que o banco de dados usa para encontrar os locais com capacidade superior a 1.000. Em vez de
verificar cada linha, o Spanner usa o índice para localizar as linhas
relevantes, o que melhora a performance da consulta, especialmente para tabelas grandes.
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;
Usar índices de pesquisa
Os índices de pesquisa são úteis quando você consulta documentos JSONB que são dinâmicos ou variados. Ao contrário dos índices secundários, é possível criar índices de pesquisa em qualquer documento JSONB armazenado em uma coluna JSONB. O índice de pesquisa se adapta automaticamente a variações em documentos JSON, entre linhas diferentes e ao longo do tempo.
No exemplo a seguir, você cria um índice de pesquisa VenuesByVenueDetails
que o banco de dados usa para encontrar os locais com detalhes específicos, como tamanho e horário de funcionamento. Em vez de verificar cada linha, o Spanner usa
o índice para localizar as linhas relevantes, o que melhora a performance da consulta,
principalmente para tabelas grandes.
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;
Para mais informações, consulte Índices de pesquisa JSON.
Consultar dados JSONB
É possível consultar colunas JSONB
com base nos valores dos campos. O
exemplo a seguir extrai VenueId
e VenueName
de Venues
, em que
VenueFeatures
tem um valor rating
maior que 3.5
.
SELECT VenueId, VenueName
FROM Venues
WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
O exemplo a seguir mostra como consultar dados JSONB
usando
bibliotecas de cliente do Spanner.
C++
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
C#
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Go
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Java
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Node.js
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
PHP
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Python
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Ruby
Para saber como instalar e usar a biblioteca de cliente do Spanner, consulte Bibliotecas de cliente do Spanner.
Para autenticar no Spanner, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Recursos do JSONB do PostgreSQL sem suporte
Os seguintes recursos de JSONB
do PostgreSQL de código aberto não são compatíveis com o
JSONB
do Spanner:
- Ordenação, comparação e agregação
- PrimaryKey e ForeignKey
- Indexação, incluindo o índice GIN. Em vez disso, use um índice de pesquisa do Spanner, que acelera as mesmas operações JSONB de um índice GIN. Para mais informações, consulte Índice de dados JSON.
- Alterar uma coluna
JSONB
para ou de qualquer outro tipo de dados - Como usar consultas parametrizadas com parâmetros JSONB não tipados em ferramentas que usam o protocolo de transmissão do PostgreSQL
Usar coerção no mecanismo de consulta. Ao contrário do PostgreSQL de código aberto, não há suporte para coerção implícita de
JSONB
para texto. É necessário usar o casting explícito do tipoJSONB
para corresponder às assinaturas de função. Exemplo: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