Nesta página, mostramos 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 armazena 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 e depois lexicograficamente pelo comprimento equivalente da chave de objeto. Se houver duas chaves de objeto iguais, 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 marcador 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
Ao criar uma tabela, é possível adicionar uma coluna JSONB a ela.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
Confira abaixo um exemplo de objeto VenueFeatures JSONB:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
Adicionar e remover colunas JSONB das 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#
Ir
Java
Node.js
PHP
Python
Ruby
Modificar dados JSONB
É possível modificar uma coluna JSONB como qualquer outra.
Segue 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
Acelere a consulta de dados JSONB usando índices secundários e índices de pesquisa com seus dados JSONB. O Spanner não aceita 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 pertinentes e os transmita para um tipo de dados SQL adequado. Em seguida, crie um índice secundário nessa coluna gerada. O índice acelera as consultas válidas que são executadas na coluna gerada.
No exemplo a seguir, crie um índice VenuesByCapacity que o
banco de dados usa para encontrar os espaços com capacidade superior a 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 para consultar 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, crie um índice de pesquisa VenuesByVenueDetails que
o banco de dados usa para encontrar os espaços 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 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 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 não compatíveis
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.
- Alteração de uma coluna
JSONBpara ou de qualquer outro tipo de dados - Uso de consultas parametrizadas com parâmetros JSONB sem tipo em ferramentas que usam o protocolo de rede do PostgreSQL
Uso de conversão no mecanismo de consulta. Ao contrário do PostgreSQL de código aberto, a conversão implícita de
JSONBpara texto não é compatível. É necessário usar a transmissão explícita do tipoJSONBpara corresponder às assinaturas de função. Por 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