Esta página descreve como trabalhar com JSON através do Spanner.
O tipo de dados JSON é um tipo de dados semiestruturado usado para armazenar dados JSON (JavaScript Object Notation). As especificações do formato JSON são descritas na RFC 7159.
O JSON é útil para complementar um esquema relacional para dados esparsos ou com uma estrutura pouco definida ou em mudança. No entanto, o otimizador de consultas baseia-se no modelo relacional para filtrar, juntar, agregar e ordenar de forma eficiente em grande escala. As consultas através de JSON têm menos otimizações incorporadas e menos opções para inspecionar e ajustar o desempenho.
Especificações
O tipo JSON do Spanner armazena uma representação normalizada do documento JSON de entrada.
- O JSON pode ser aninhado até um máximo de 80 níveis.
- Os espaços em branco não são preservados.
- Os comentários não são suportados. As transações ou as consultas com comentários vão falhar.
- Os membros de um objeto JSON são ordenados lexicograficamente.
- Os elementos da matriz JSON têm a respetiva ordem preservada.
- Se um objeto JSON tiver chaves duplicadas, apenas a primeira é preservada.
- Os tipos primitivos (string, booleano, número e nulo) têm o respetivo tipo e valor preservados.
- Os valores do tipo string são preservados exatamente.
- Os valores do tipo de número são preservados, mas a respetiva representação textual pode ser alterada como resultado do processo de normalização. Por exemplo, um número de entrada de 10 000 pode ter uma representação normalizada de 1e+4. A semântica de preservação de valores numéricos é a seguinte:
- Os números inteiros com sinal no intervalo de [INT64_MIN, INT64_MAX] são preservados.
- Os números inteiros não assinados no intervalo de [0, UINT64_MAX] são preservados.
- Os valores duplos que podem ser convertidos de cadeia para duplo e de volta para cadeia sem perda de precisão são preservados. Se não for possível fazer o round trip de um valor duplo desta forma, a transação ou a consulta falha.
- Por exemplo,
SELECT JSON '2.2412421353246235436'
falha. - Uma solução alternativa funcional é
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round')
, que devolveJSON '2.2412421353246237'
.
- Por exemplo,
- Use as funções
TO_JSON()
,JSON_OBJECT()
> eJSON_ARRAY()
para criar documentos JSON em SQL. Estas funções implementam os carateres de escape e as aspas necessários.
O tamanho máximo permitido do documento normalizado é de 10 MB.
Condição de nulidade
Os valores JSON null
são tratados como SQL não NULL.
Por exemplo:
SELECT (JSON '{"a":null}').a IS NULL; -- Returns FALSE
SELECT (JSON '{"a":null}').b IS NULL; -- Returns TRUE
SELECT JSON_QUERY(JSON '{"a":null}', "$.a"); -- Returns a JSON 'null'
SELECT JSON_QUERY(JSON '{"a":null}', "$.b"); -- Returns a SQL NULL
Codificação
Os documentos JSON têm de ser codificados em UTF-8. As transações ou as consultas com documentos JSON codificados noutros formatos devolvem um erro.
Crie uma tabela com colunas JSON
Pode adicionar uma coluna JSON a uma tabela quando a tabela é criada. Os valores do tipo JSON podem ser anuláveis.
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
Adicione e remova colunas JSON de tabelas existentes
Também é possível adicionar e remover uma coluna JSON de tabelas existentes.
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
O exemplo seguinte mostra como adicionar uma coluna JSON
denominada VenueDetails
à tabela Venues
através das bibliotecas cliente do Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modifique os dados JSON
O exemplo seguinte mostra como atualizar os dados de JSON
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 JSON usando índices secundários e índices de pesquisa com os seus dados JSON. O Spanner não suporta a utilização de colunas do tipo JSON 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 JSON. Para usar índices secundários com JSON, crie uma coluna gerada que extraia os dados escalares relevantes e converta os dados num tipo 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 INT64 AS (INT64(VenueDetails.capacity));
CREATE INDEX VenuesByCapacity ON Venue (VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
Use índices de pesquisa
Os índices de pesquisa são úteis quando faz consultas em documentos JSON dinâmicos ou variados. Ao contrário dos índices secundários, pode criar índices de pesquisa em qualquer documento JSON armazenado numa coluna JSON. 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 TOKENLIST AS (TOKENIZE_JSON(VenueDetails)) HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venue (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE JSON_CONTAINS(VenueDetails, JSON '{"labels": ["large"], "open": {"Friday": true}}');
Para mais informações, consulte o artigo Índices de pesquisa JSON.
Consultar dados JSON
O exemplo seguinte mostra como consultar dados JSON
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.
Restrições
- Não pode usar colunas JSON numa cláusula
ORDER BY
. - Não pode usar colunas do tipo JSON como chaves principais nem como chaves em índices secundários. Para mais informações, consulte o artigo Indexe dados JSON.
O que se segue?
- Tipo de dados JSON
- Funções JSON
- Operadores JSON: