Esta página descreve como trabalhar com JSON usando o Spanner.
Os dados do tipo JSON são semiestruturados e usados para armazenar dados JSON (JavaScript Object Notation). As especificações do formato JSON são descritas em RFC 7159 (em inglês).
O JSON é útil para complementar um esquema relacional para dados esparsos ou que com uma estrutura vagamente definida ou mutável. No entanto, o otimizador de consultas se baseia no modelo relacional para filtrar, juntar, agregar e classificar de maneira eficiente em escala. As consultas por JSON terão menos otimizações e recursos integrados 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 para um máximo de 80 níveis.
- O espaço em branco não é preservado.
- Não é possível usar comentários. Transações ou consultas com comentários falharão.
- Os membros de um objeto JSON são classificados lexicograficamente.
- A ordem dos elementos da matriz JSON é preservada.
- Se um objeto JSON tiver chaves duplicadas, apenas a primeira será preservada.
- O tipo e o valor de tipos primitivos (string, booleano, número e nulo) serão preservados.
- Os valores do tipo string serão preservados.
- Os valores do tipo de número serão preservados, mas podem ter a representação textual
como resultado do processo de normalização. Por
exemplo, um número de entrada de 10000 pode ter uma representação normalizada de 1e+4. A semântica de preservação de valor numérico
é a seguinte:
- Os números inteiros assinados 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.
- Valores duplicados que podem ser enviados entre string e duplicatas
sem perda de precisão são preservados. Se o valor duplicado não puder ser enviado assim,
a transação ou a consulta falhará.
- Por exemplo,
SELECT JSON '2.2412421353246235436'
falha. - Uma solução funcional é
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round')
, que retornaJSON '2.2412421353246237'
.
- Por exemplo,
- Use as funções
TO_JSON()
,JSON_OBJECT()
eJSON_ARRAY()
para construir documentos JSON no SQL. Essas funções implementam os caracteres de aspas e de escape necessários.
O tamanho máximo permitido do documento normalizado é 10 MB.
Nulidade
Os valores JSON null
são tratados como SQL não NULL.
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 precisam ser codificados em UTF-8. Transações ou consultas com documentos JSON codificados em outros formatos retornam um erro.
Criar uma tabela com colunas JSON
Uma coluna JSON pode ser adicionada a uma tabela quando ela é 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);
Adicionar e remover colunas JSON de tabelas atuais
Também é possível adicionar e remover uma coluna JSON das tabelas atuais.
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
O exemplo a seguir mostra como adicionar uma coluna JSON
chamada VenueDetails
à
tabela Venues
usando as bibliotecas de cliente do Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modificar dados JSON
O exemplo a seguir mostra como atualizar dados JSON
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.
Índice de dados JSON
É possível acelerar a consulta de dados JSON usando índices secundários e índices de pesquisa com seus dados JSON. O Spanner não oferece suporte ao uso de colunas do tipo JSON como chaves em índices secundários.
Usar índice secundário
Os índices secundários são úteis ao filtrar valores escalares em um documento JSON. Para usar índices secundários com JSON, crie uma coluna gerada que extraia os dados escalares relevantes e converta os dados para um tipo SQL adequado. Em seguida, crie um índice secundário nessa coluna gerada. O índice acelera as consultas qualificadas que são 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 superior a 1.000. Em vez de
verificar cada linha, o Spanner usa o índice para localizar as linhas
relevantes, o que melhora a performance da consulta, 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;
Usar índices de pesquisa
Os índices de pesquisa são úteis quando você consulta documentos JSON que são dinâmicos ou variados. Ao contrário dos índices secundários, é possível criar índices de pesquisa em qualquer documento JSON armazenado em uma coluna JSON. O índice de pesquisa se adapta automaticamente a variações em documentos JSON, entre linhas diferentes 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 cada linha, o Spanner usa
o índice para localizar as linhas relevantes, o que melhora a performance da consulta,
principalmente 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 Índices de pesquisa JSON.
Consultar dados JSON
O exemplo a seguir mostra como consultar dados JSON
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.
Restrições
- Não é possível usar colunas JSON em uma cláusula
ORDER BY
. - Não é possível usar colunas do tipo JSON como chaves primárias ou em índices secundários. Para mais informações, consulte Índice de dados JSON.
A seguir
- Tipo de dados JSON
- Funções JSON
- Operadores JSON: