JSONvisão geral do tipo de dados - Amazon ElastiCache

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

JSONvisão geral do tipo de dados

ElastiCache suporta vários OSS comandos Valkey e Redis para trabalhar com o tipo de JSON dados. Veja a seguir uma visão geral do tipo de JSON dados e uma lista detalhada dos comandos compatíveis.

Terminologia

Prazo Descrição

JSONdocumento

Refere-se ao valor de uma JSON chave.

JSONvalor

Refere-se a um subconjunto de um JSON documento, incluindo a raiz que representa o documento inteiro. Um valor poderia ser um contêiner ou uma entrada dentro de um contêiner.

JSONelemento

Equivalente ao JSON valor.

JSONPadrão suportado

JSONo formato é compatível com os padrões de intercâmbio de RFCdados 7159 e ECMAJSON-404. UTF-8 Unicode em JSON texto é suportado.

Elemento raiz

O elemento raiz pode ser de qualquer tipo de JSON dados. Observe que no RFC 4627 anterior, somente objetos ou matrizes eram permitidos como valores raiz. Desde a atualização para RFC 7159, a raiz de um JSON documento pode ser de qualquer tipo de JSON dados.

Limite de tamanho de documentos

JSONos documentos são armazenados internamente em um formato otimizado para acesso e modificação rápidos. Esse formato normalmente resulta no consumo um pouco maior de memória do que a representação serializada equivalente do mesmo documento.

O consumo de memória por um único JSON documento é limitado a 64 MB, que é o tamanho da estrutura de dados na memória, não a JSON string. Você pode verificar a quantidade de memória consumida por um JSON documento usando o JSON.DEBUG MEMORY comando.

JSON ACLs

  • Semelhante às categorias existentes por tipo de dados (@string, @hash etc.), uma nova categoria @json foi adicionada para simplificar o gerenciamento do acesso a JSON comandos e dados. Nenhum outro OSS comando existente do Valkey ou do Redis é membro da categoria @json. Todos os JSON comandos impõem quaisquer restrições e permissões de teclas ou comandos.

  • Há cinco OSS ACL categorias existentes do Valkey e do Redis que foram atualizadas para incluir os novos JSON comandos: @read, @write, @fast, @slow e @admin. A tabela a seguir indica o mapeamento dos JSON comandos para as categorias apropriadas.

ACL
JSONcomando @read @write @fast @slow @admin

JSON.ARRAPPEND

y

y

JSON.ARRINDEX

y

y

JSON.ARRINSERT

y

y

JSON.ARRLEN

y

y

JSON.ARRPOP

y

y

JSON.ARRTRIM

y

y

JSON.CLEAR

y

y

JSON.DEBUG

y

y

y

JSON.DEL

y

y

JSON.FORGET

y

y

JSON.GET

y

y

JSON.MGET

y

y

JSON.NUMINCRBY

y

y

JSON.NUMMULTBY

y

y

JSON.OBJKEYS

y

y

JSON.OBJLEN

y

y

JSON.RESP

y

y

JSON.SET

y

y

JSON.STRAPPEND

y

y

JSON.STRLEN

y

y

JSON.STRLEN

y

y

JSON.TOGGLE

y

y

JSON.TYPE

y

y

JSON.NUMINCRBY

y

y

Limite de profundidade de aninhamento

Quando um JSON objeto ou matriz tem um elemento que é, em si mesmo, outro JSON objeto ou matriz, diz-se que esse objeto ou matriz interno está “aninhado” dentro do objeto ou matriz externa. O limite máximo de profundidade de aninhamento é 128. Qualquer tentativa de criar um documento que contenha uma profundidade de aninhamento maior que 128 será rejeitada com um erro.

Sintaxe de comando

A maioria dos comandos exige um nome de chave como primeiro argumento. Alguns comandos também têm um argumento path (caminho). O argumento path (caminho) será padronizado para a raiz se for opcional e não fornecido.

Notação:

  • Os argumentos obrigatórios são colocados entre colchetes angulares. Por exemplo: <key>

  • Os argumentos opcionais são colocados dentro de colchetes. Por exemplo: [path]

  • Os argumentos opcionais adicionais são indicados por reticências (“...”). Por exemplo: [json...]

Sintaxe de caminho

O Redis JSON oferece suporte a dois tipos de sintaxes de caminho:

  • Sintaxe aprimorada — segue a JSONPath sintaxe descrita por Goessner, conforme mostrado na tabela a seguir. Reordenamos e modificamos as descrições na tabela para maior clareza.

  • Sintaxe restrita - Tem recursos de consulta limitados.

nota

Os resultados de alguns comandos são sensíveis ao tipo de sintaxe de caminho usado.

Se um caminho de consulta começar com '$', ele usará a sintaxe aprimorada. Caso contrário, a sintaxe restrita será usada.

Sintaxe aprimorada

Símbolo/Expressão Descrição

$

O elemento raiz.

. ou []

Operador filho.

..

Descida recursiva.

*

Curinga. Todos os elementos em um objeto ou matriz.

[]

Operador subscrito de matriz. O índice é baseado em 0.

[,]

Operador da união.

[start:end:step]

Operador de matriz slice.

?()

Aplica uma expressão de filtro (script) à matriz ou objeto atual.

()

Expressão de filtro.

@

Usado em expressões de filtro que consultam o nó atual que está sendo processado.

==

Igual a, usado em expressões de filtro.

!=

Não é igual a, usado em expressões de filtro.

>

Maior que, usado em expressões de filtro.

>=

Maior que ou igual a, usado em expressões de filtro.

<

Menor que, usado em expressões de filtro.

<=

Menor que ou igual a, usado em expressões de filtro.

&&

LógicoAND, usado para combinar várias expressões de filtro.

||

OR lógico, usado para combinar várias expressões de filtro.

Exemplos

Os exemplos a seguir são baseados nos XML dados de exemplo de Goessner, que modificamos adicionando campos adicionais.

{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "in-stock": true, "sold": true }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "in-stock": false, "sold": true }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "in-stock": true, "sold": false }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "in-stock": false, "sold": false } ], "bicycle": { "color": "red", "price": 19.95, "in-stock": true, "sold": false } } }
Path Descrição

$.store.book[*].author

Os autores de todos os livros da loja.

$..author

Todos os autores.

$.store.*

Todos os membros da loja.

$["store"].*

Todos os membros da loja.

$.store..price

O preço de tudo na loja.

$..*

Todos os membros recursivos da JSON estrutura.

$..book[*]

Todos os livros.

$..book[0]

O primeiro livro.

$..book[-1]

O último livro.

$..book[0:2]

Os dois primeiros livros.

$..book[0,1]

Os dois primeiros livros.

$..book[0:4]

Livros do índice 0 a 3 (o índice final não é inclusivo).

$..book[0:4:2]

Livros no índice 0, 2.

$..book[?(@.isbn)]

Todos os livros com um ISBN número.

$..book[?(@.price<10)]

Todos os livros mais baratos que US$ 10.

'$..book[?(@.price < 10)]'

Todos os livros são mais baratos do que US$ 10. (O caminho deverá estar entre aspas se contiver espaços em branco.)

'$..book[?(@["price"] < 10)]'

Todos os livros mais baratos que US$ 10.

'$..book[?(@.["price"] < 10)]'

Todos os livros mais baratos que US$ 10.

$..book[?(@.price>=10&&@.price<=100)]

Todos os livros na faixa de preço entre US$ 10 a US$ 100, inclusive.

'$..book[?(@.price>=10 && @.price<=100)]'

Todos os livros na faixa de preço entre US$ 10 a US$ 100, inclusive. (O caminho deverá estar entre aspas se contiver espaços em branco.)

$..book[?(@.sold==true||@.in-stock==false)]

Todos os livros vendidos ou esgotados.

'$..book[?(@.sold == true || @.in-stock == false)]'

Todos os livros vendidos ou esgotados. (O caminho deverá estar entre aspas se contiver espaços em branco.)

'$.store.book[?(@.["category"] == "fiction")]'

Todos os livros na categoria ficção.

'$.store.book[?(@.["category"] != "fiction")]'

Todos os livros nas categorias não ficção.

Exemplos adicionais de expressões de filtro:

127.0.0.1:6379> JSON.SET k1 . '{"books": [{"price":5,"sold":true,"in-stock":true,"title":"foo"}, {"price":15,"sold":false,"title":"abc"}]}' OK 127.0.0.1:6379> JSON.GET k1 $.books[?(@.price>1&&@.price<20&&@.in-stock)] "[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?(@.price>1 && @.price<20 && @.in-stock)]' "[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?((@.price>1 && @.price<20) && (@.sold==false))]' "[{\"price\":15,\"sold\":false,\"title\":\"abc\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?(@.title == "abc")]' [{"price":15,"sold":false,"title":"abc"}] 127.0.0.1:6379> JSON.SET k2 . '[1,2,3,4,5]' 127.0.0.1:6379> JSON.GET k2 $.*.[?(@>2)] "[3,4,5]" 127.0.0.1:6379> JSON.GET k2 '$.*.[?(@ > 2)]' "[3,4,5]" 127.0.0.1:6379> JSON.SET k3 . '[true,false,true,false,null,1,2,3,4]' OK 127.0.0.1:6379> JSON.GET k3 $.*.[?(@==true)] "[true,true]" 127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ == true)]' "[true,true]" 127.0.0.1:6379> JSON.GET k3 $.*.[?(@>1)] "[2,3,4]" 127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ > 1)]' "[2,3,4]"

Sintaxe restrita

Símbolo/Expressão Descrição

. ou []

Operador filho.

[]

Operador subscrito de matriz. O índice é baseado em 0.

Exemplos

Path Descrição

.store.book[0].author

O autor do primeiro livro.

.store.book[-1].author

O autor do último livro.

.address.city

Nome da cidade.

["store"]["book"][0]["title"]

O título do primeiro livro.

["store"]["book"][-1]["title"]

O título do último livro.

nota

Todo conteúdo de Goessner citado nesta documentação está sujeito à Licença da Creative Commons.

Prefixos de erro comuns

Cada mensagem de erro tem um prefixo. Veja a seguir uma lista de prefixos de erro comuns.

Prefixo Descrição

ERR

Um erro geral.

LIMIT

Um erro que ocorre quando o limite de tamanho é excedido. Por exemplo, o limite de tamanho do documento ou limite de profundidade de aninhamento estava excedido.

NONEXISTENT

Uma chave ou caminho não existe.

OUTOFBOUNDARIES

Índice de matriz fora dos limites.

SYNTAXERR

Erro de sintaxe.

WRONGTYPE

Tipo de valor errado.

JSONmétricas relacionadas

As seguintes métricas de JSON informações são fornecidas:

Informações Descrição

json_total_memory_bytes

Memória total alocada aos JSON objetos.

json_num_documents

Número total de documentos no Valkey ou no RedisOSS.

Para consultar as métricas principais, execute o seguinte comando:

info json_core_metrics

Como o ElastiCache Valkey e o Redis interagem OSS com JSON

A seção a seguir descreve como o ElastiCache Valkey e o Redis OSS interagem com o JSON tipo de dados.

Precedência do operador

Ao avaliar expressões condicionais para filtragem, &&s têm precedência primeiro e, em seguida, ||s são avaliadas, como é comum na maioria das linguagens. As operações dentro de parênteses são executadas primeiro.

Comportamento do limite máximo de aninhamento de caminho

O limite máximo de aninhamento de caminhos em ElastiCache (RedisOSS) é 128. Por isso, um valor como $.a.b.c.d... só pode atingir 128 níveis.

Processamento de valores numéricos

JSONnão tem tipos de dados separados para números inteiros e números de ponto flutuante. Todos eles são chamados de números.

Representações numéricas:

Quando um JSON número é recebido na entrada, ele é convertido em uma das duas representações binárias internas: um inteiro assinado de 64 bits ou um ponto flutuante de precisão IEEE dupla de 64 bits. A string original e toda a sua formatação não serão retidas. Assim, quando um número é gerado como parte de uma JSON resposta, ele é convertido da representação binária interna em uma string imprimível que usa regras de formatação genéricas. Essas regras podem resultar em uma string diferente da que foi recebida.

Comandos aritméticos NUMINCRBY e NUMMULTBY:

  • Se os dois números forem inteiros e o resultado estiver fora do intervalo deint64, ele se tornará automaticamente um número de ponto flutuante de precisão IEEE dupla de 64 bits.

  • Se pelo menos um dos números for um ponto flutuante, o resultado será um número de ponto flutuante de precisão IEEE dupla de 64 bits.

  • Se o resultado exceder o intervalo de 64 bits IEEE duplos, o comando retornará um OVERFLOW erro.

Para obter uma lista detalhada dos comandos disponíveis, consulte Comandos Valkey e Redis OSS suportados.

Filtragem direta de matriz

ElastiCache com Valkey ou Redis OSS filtra objetos de matriz diretamente.

Para dados como [0,1,2,3,4,5,6] e uma consulta de caminho como$[?(@<4)], ou dados como {"my_key":[0,1,2,3,4,5,6]} e uma consulta de caminho como$.my_key[?(@<4)], ElastiCache com Valkey ou Redis OSS retornaria [1,2,3] em ambas as circunstâncias.

Comportamento de indexação de matriz

ElastiCache com Valkey ou Redis OSS permite índices positivos e negativos para matrizes. Para uma matriz de comprimento cinco, 0 consultaria o primeiro elemento, 1 o segundo, e assim por diante. Números negativos começam no fim da matriz, então -1 consultaria o quinto elemento, -2 o quarto elemento e assim por diante.

Para garantir um comportamento previsível para os clientes, ElastiCache com o Valkey ou o Redis, OSS não arredonda os índices de matriz para baixo ou para cima. Portanto, se você tiver uma matriz com um comprimento de 5, chamar o índice 5 ou superior, ou -6 ou inferior, não produziria um resultado.

Avaliação estrita da sintaxe

O MemoryDB não permite JSON caminhos com sintaxe inválida, mesmo que um subconjunto do caminho contenha um caminho válido. Isso acontece para manter o comportamento correto para nossos clientes.