Esta página descreve como trabalhar com o tipo de dados JSONB quando usa o Spanner.
JSONB é um tipo de dados 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 na RFC 7159.
Especificações
O tipo de dados JSONB do Spanner armazena uma representação normalizada do documento de entrada. Isto implica o seguinte:
- As aspas e os carateres de espaço em branco não são preservados.
- Os comentários não são suportados. As transações ou as consultas com comentários falham.
- As chaves de objetos são ordenadas primeiro pelo comprimento da chave e, em seguida, lexicograficamente pelo comprimento da chave de objeto equivalente. Se existirem chaves de objetos duplicadas, apenas a última é preservada.
- Os tipos primitivos (
string,boolean,numberenull) têm o respetivo tipo e valor 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ão-NULL. 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
Aplicam-se as seguintes restrições com o Spanner JSONB:
- Os argumentos da função
to_jsonbsó podem ser dos tipos de dados do PostgreSQL que o Spanner suporta. - Os valores do tipo Number podem ter 4932 dígitos antes da vírgula decimal e 16 383 dígitos depois da vírgula decimal.
- O tamanho máximo permitido do formato de armazenamento normalizado é de 10 MB.
- Os documentos
JSONBtêm de ser codificados em UTF-8. As transações ou as consultas comJSONBdocumentos codificados noutros formatos devolvem um erro.
Crie uma tabela com colunas JSONB
Pode adicionar uma coluna JSONB a uma tabela quando a cria.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
Segue-se um objeto VenueFeatures JSONB de exemplo:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
Adicione e remova colunas JSONB de tabelas existentes
Pode adicionar uma coluna JSONB e eliminá-la usando declarações ALTER da seguinte forma:
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
O exemplo seguinte mostra como adicionar uma coluna JSONB denominada VenueDetails à tabela Venues através das bibliotecas cliente do Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modifique dados JSONB
Pode modificar uma coluna JSONB tal como qualquer outra coluna.
Segue-se um exemplo:
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
O exemplo seguinte mostra como atualizar os dados de JSONB através das bibliotecas de cliente do Spanner.
C++
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
C#
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Go
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Java
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Node.js
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
PHP
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Python
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Ruby
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Indexe dados JSON
Pode acelerar a consulta de dados JSONB usando índices secundários e índices de pesquisa com os seus dados JSONB. O Spanner não suporta a utilização de colunas do tipo JSONB como chaves em índices secundários.
Use o índice secundário
Os índices secundários são úteis quando filtra por valores escalares num documento JSONB. Para usar índices secundários com JSONB, crie uma coluna gerada que extraia os dados escalares relevantes e os converta num tipo de dados SQL adequado. Em seguida, pode criar um índice secundário sobre esta coluna gerada. O índice acelera as consultas elegíveis que são executadas em relação à coluna gerada.
No exemplo seguinte, cria um índice VenuesByCapacity que a base de dados usa para encontrar os locais com capacidades superiores a 1000. Em vez de verificar todas as linhas, o Spanner usa o índice para localizar as linhas relevantes, o que melhora o desempenho das consultas, 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;
Use índices de pesquisa
Os índices de pesquisa são úteis quando faz consultas em documentos JSONB que são dinâmicos ou variados. Ao contrário dos índices secundários, pode criar índices de pesquisa em qualquer documento JSONB armazenado numa coluna JSONB. O índice de pesquisa adapta-se automaticamente às variações nos documentos JSON, entre diferentes linhas e ao longo do tempo.
No exemplo seguinte, cria um VenuesByVenueDetailsíndice de pesquisa que
a base de dados usa para encontrar os locais com detalhes específicos, como a dimensão e
o 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 das consultas, 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 o artigo Índices de pesquisa JSON.
Consultar dados JSONB
Pode consultar JSONB colunas com base nos valores dos campos subjacentes. O exemplo seguinte extrai VenueId e VenueName de Venues, em que VenueFeatures tem um valor rating superior a 3.5.
SELECT VenueId, VenueName
FROM Venues
WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
O exemplo seguinte mostra como consultar dados de JSONB usando as bibliotecas cliente do Spanner.
C++
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
C#
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Go
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Java
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Node.js
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
PHP
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Python
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Ruby
Para saber como instalar e usar a biblioteca cliente do Spanner, consulte o artigo Bibliotecas cliente do Spanner.
Para se autenticar no Spanner, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Funcionalidades JSONB do PostgreSQL não suportadas
As seguintes funcionalidades do PostgreSQL de código aberto JSONB não são suportadas no
Spanner JSONB:
- Ordenação, comparação e agregação
- PrimaryKey e ForeignKey
- Indexação, incluindo o índice GIN. Em alternativa, pode usar um índice de pesquisa do Spanner, que acelera as mesmas operações JSONB que um índice GIN. Para mais informações, consulte o artigo Indexar dados JSON.
- Alterar uma coluna
JSONBpara ou a partir de qualquer outro tipo de dados - Usar consultas parametrizadas com parâmetros JSONB não tipados em ferramentas que usam o protocolo de rede do PostgreSQL
Usar coerção no motor de consultas. Ao contrário do PostgreSQL de código aberto, a coerção implícita de
JSONBpara texto não é suportada. Tem de usar a conversão explícita do tipoJSONBpara corresponder às assinaturas das funções. 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