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
,number
enull
) têm o respetivo tipo e valor preservados.- Os valores do tipo
string
são preservados exatamente. - Os zeros à direita 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
JSONB
null
sã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 NULL
A 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_jsonb
só 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
JSONB
têm de ser codificados em UTF-8. As transações ou as consultas comJSONB
documentos 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
JSONB
para 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
JSONB
para texto não é suportada. Tem de usar a conversão explícita do tipoJSONB
para 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