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
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
{ "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
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 de
int64
, 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.