Nesta página, descrevemos 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 PostgreSQL do Spanner. JSONB contém dados no formato JavaScript Object Notation (JSON), que segue a especificação descrita em RFC 7159 (em inglês).
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 objeto são classificadas primeiro pelo comprimento da chave e depois lexicograficamente pelo comprimento equivalente da chave de objeto. Se houver chaves de objeto duplicadas, apenas a última será preservada.
- O tipo e o valor de tipos primitivos (
string,boolean,numberenull) serão preservados.- Os valores do tipo
stringsão preservados exatamente. - Os zeros à direita são preservados. O formato de saída para valores do tipo
numbernão usa notação científica.
- Os valores do tipo
Os valores
JSONBnullsã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 NULLA ordem dos elementos da matriz JSONB é preservada.
Restrições
As seguintes restrições se aplicam ao Spanner JSONB:
- Os argumentos da função
to_jsonbsó podem ser dos tipos de dados do PostgreSQL compatíveis com o Spanner. - Os valores do tipo número podem ter 4.932 dígitos antes do ponto decimal e 16.383 dígitos depois dele.
- O tamanho máximo permitido do formato de armazenamento normalizado é de 10 MB.
- Os documentos
JSONBprecisam ser codificados em UTF-8. Transações ou consultas com documentosJSONBcodificados em outros formatos retornam um erro.
Criar uma tabela com colunas JSONB
É possível adicionar uma coluna JSONB a uma tabela ao criá-la.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
Confira abaixo 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 remover 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 as 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.
Indexar 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 é compatível com o 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 extraia os dados escalares relevantes e os converta em um tipo de dados SQL adequado. Em seguida, você pode criar um índice secundário nessa coluna gerada. O índice acelera as consultas qualificadas 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 maior que 1.000. Em vez de verificar todas as linhas, o Spanner usa o índice para localizar as linhas relevantes, o que melhora o desempenho 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(VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
Usar índices de pesquisa
Os índices de pesquisa são úteis quando você consulta documentos JSONB 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 diferentes linhas 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 todas as linhas, o Spanner usa o índice para localizar as linhas relevantes, o que melhora o desempenho da consulta, especialmente em 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 subjacentes. 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
as 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 JSONB do PostgreSQL sem suporte
Os seguintes recursos do PostgreSQL de código aberto JSONB não são compatíveis com o
Spanner JSONB:
- 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 que um índice GIN. Para mais informações, consulte Indexar dados JSON.
- Alterar uma coluna
JSONBpara ou de qualquer outro tipo de dados - Como usar consultas parametrizadas com parâmetros JSONB sem tipo em ferramentas que usam o protocolo de rede do PostgreSQL
Usar coerção no mecanismo de consulta. Ao contrário do PostgreSQL de código aberto, a coerção implícita de
JSONBpara texto não é compatível. É necessário usar a conversão explícita do tipoJSONBpara 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