TairDoc é uma estrutura de dados de documentos semelhante ao RedisJSON. Use-o para armazenar, consultar e manipular documentos JSON com suporte completo a operações CRUD.
Principais recursos:
Suporte completo ao padrão JSON
Suporte a JSONPath (RFC draft-4) via
JSON.GET; seletores específicos como wildcard de ponto, índice e filtro exigem a versão 1.8.4 ou posteriorSuporte completo à sintaxe JSON Pointer (RFC 6901)
Armazenamento em árvore binária para recuperação eficiente de elementos filhos
Conversão de JSON para XML e de JSON para YAML via
JSON.GET
Notas de versão:
O TairDoc foi lançado junto com as instâncias otimizadas para memória do Tair. Ele oferece suporte à sintaxe JSONPointer completa e à sintaxe JSONPath parcial (somente
JSON.GETaceita a sintaxe JSONPath).Em 17 de maio de 2022, o TairDoc V1.8.4 foi lançado com suporte completo a JSONPath para
JSON.GET, incluindo o seletor wildcard de ponto, o seletor de índice e o seletor de filtro. Recomendamos atualizar a versão secundária da instância para 1.8.4 ou posterior.
Pré-requisitos
Antes de começar, verifique se você tem:
Versão secundária da instância 1.8.4 ou posterior (necessária para suporte completo a JSONPath via
JSON.GET)
Para atualizar sua instância para a versão secundária mais recente, consulte Atualizar a versão secundária de uma instância.
Em instâncias do tipo cluster ou com divisão de leitura/gravação, atualize os nós proxy para a versão secundária mais recente a fim de garantir o funcionamento correto de todos os comandos.
Lista de comandos
|
Comando |
Descrição |
Complexidade de tempo |
|
Cria uma chave TairDoc ou atualiza um elemento JSON em um caminho |
O(N) |
|
|
Recupera um elemento JSON de um caminho |
O(N) |
|
|
Exclui um elemento JSON ou uma chave |
O(N) |
|
|
Retorna o tipo de um elemento JSON |
O(N) |
|
|
Mescla um valor JSON em um caminho |
O(N) |
|
|
Incrementa um elemento JSON numérico |
O(N) |
|
|
Acrescenta uma string a um elemento JSON do tipo string |
O(N) |
|
|
Retorna o comprimento de um elemento JSON do tipo string |
O(N) |
|
|
Acrescenta elementos ao final de um array |
O(M×N) |
|
|
Remove e retorna um elemento de um array |
O(M×N) |
|
|
Insere elementos antes de um índice especificado em um array |
O(M×N) |
|
|
Retorna o comprimento de um array |
O(N) |
|
|
Reduz um array a um intervalo especificado |
O(N) |
|
|
Exclui uma ou mais chaves TairDoc (comando nativo do Redis) |
— |
Convenções de sintaxe usadas nesta referência:
UPPERCASE: palavra-chave do comando_italic_: variável[option]: parâmetro opcionalA | B: opções mutuamente exclusivas...: parâmetro que pode ser repetido
JSON.SET
Sintaxe: JSON.SET key path json [NX | XX]
Cria uma chave TairDoc e armazena um elemento JSON no caminho especificado. Se a chave e o caminho já existirem, o elemento é atualizado.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho dentro da chave. Use |
|
|
O elemento JSON a ser armazenado |
|
|
Grava somente se o caminho não existir |
|
|
Grava somente se o caminho já existir |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
|
|
|
|
|
|
|
|
Caminho inválido |
|
Exemplo — criar um documento JSON:
O comando a seguir cria uma chave doc no caminho raiz ($) e armazena um documento de livraria com quatro livros e uma bicicleta:
JSON.SET doc $ '{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } }'
Saída esperada:
OK
JSON.GET
Sintaxe: JSON.GET key path [FORMAT XML | YAML] [ROOTNAME root] [ARRNAME arr]
Recupera o elemento JSON no caminho especificado. Aceita as sintaxes JSONPath e JSON Pointer.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho dentro da chave. Aceita a sintaxe JSONPath (estilo |
|
|
Formato de saída: |
|
|
Nome da tag para o elemento raiz na saída XML. Válido somente quando |
|
|
Nome da tag para elementos de array na saída XML. Válido somente quando |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
O elemento JSON no caminho especificado |
|
Erro |
Mensagem de erro |
Exemplo — recuperar um documento como XML:
Primeiro, crie o documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Em seguida, recupere-o como XML, especificando ROOT como nome da tag raiz e ARR como nome da tag de array:
JSON.GET doc . FORMAT XML ROOTNAME ROOT ARRNAME ARR
Saída esperada:
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><ROOT><foo>bar</foo><baz>42</baz></ROOT>"
JSON.DEL
Sintaxe: JSON.DEL key path
Exclui o elemento JSON no caminho especificado. Se nenhum caminho for fornecido, a chave inteira é excluída. Não faz nada caso a chave ou o caminho não exista.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do elemento a ser excluído. Se omitido, a chave inteira é excluída |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
|
|
Chave ou caminho não encontrado |
|
Exemplo — excluir um campo:
Primeiro, crie o documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Exclua o campo foo:
JSON.DEL doc .foo
Saída esperada — 1 indica que o elemento foi excluído:
(integer) 1
JSON.TYPE
Sintaxe: JSON.TYPE key path
Retorna o tipo do elemento JSON no caminho especificado.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do elemento |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
Um dos seguintes: |
|
Falha |
|
|
Chave ou caminho não encontrado |
|
Exemplo — obter o tipo de um campo:
Primeiro, crie o documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Obtenha o tipo do campo foo ("bar" é uma string):
JSON.TYPE doc .foo
Saída esperada:
string
JSON.MERGE
Sintaxe: JSON.MERGE key path value
Mescla um valor JSON no caminho especificado. Permite adicionar novos valores, atualizar valores existentes e excluir valores no caminho indicado.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho para mesclar. Aceita sintaxe JSONPath parcial (por exemplo, |
|
|
O valor JSON a ser mesclado. Compatível com JSON Merge Patch (RFC 7386) |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
|
|
Valor inválido |
Erro (falha ao interpretar o patch de mesclagem) |
Exemplo — adicionar, atualizar e excluir valores em uma única operação:
Primeiro, crie o documento:
JSON.SET doc $ '{"f1": {"a":1}, "f2":{"a":2}}'
Mescle as alterações: defina f1 como null (o que o exclui), atualize f2.a e adicione f2.b, além de inserir um novo array f3:
JSON.MERGE doc $ '{"f1": null, "f2":{"a":3, "b":4}, "f3":[2,4,6]}'
Saída esperada:
OK
Verifique o resultado com JSON.GET doc .. A chave f1 é removida porque definir um campo como null em um patch de mesclagem o exclui:
"{\"f2\":{\"a\":3,\"b\":4},\"f3\":[2,4,6]}"
JSON.NUMINCRBY
Sintaxe: JSON.NUMINCRBY key path value
Incrementa o elemento JSON numérico no caminho especificado. O elemento existente e o valor do incremento devem ser do mesmo tipo — inteiro ou double.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do elemento numérico |
|
|
O valor a ser adicionado |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
O novo valor após o incremento |
|
Chave ou caminho não encontrado |
Erro |
Exemplo — incrementar um campo numérico:
Primeiro, crie o documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Incremente baz em 10 (42 + 10 = 52):
JSON.NUMINCRBY doc .baz 10
Saída esperada:
"52"
JSON.STRAPPEND
Sintaxe: JSON.STRAPPEND key path json-string
Acrescenta uma string ao elemento JSON do tipo string no caminho especificado. O elemento existente e o valor acrescentado devem ser do tipo string.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do elemento string |
|
|
A string a ser acrescentada |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
O novo comprimento da string |
|
Chave não encontrada |
|
Exemplo — acrescentar a um campo string:
Primeiro, crie o documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Acrescente rrrrr a foo — "bar" passa a ser "barrrrrr", com 8 caracteres:
JSON.STRAPPEND doc .foo rrrrr
Saída esperada:
(integer) 8
JSON.STRLEN
Sintaxe: JSON.STRLEN key path
Retorna o comprimento em caracteres do elemento JSON do tipo string no caminho especificado. O elemento deve ser do tipo string.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do elemento string |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
Comprimento da string |
|
Chave não encontrada |
|
Exemplo — obter o comprimento de um campo string:
Primeiro, crie o documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Obtenha o comprimento de foo — "bar" tem 3 caracteres:
JSON.STRLEN doc .foo
Saída esperada:
(integer) 3
JSON.ARRAPPEND
Sintaxe: JSON.ARRAPPEND key path json [json ...]
Acrescenta um ou mais elementos JSON ao final de um array. A complexidade de tempo é O(M×N), onde M é o número de elementos a acrescentar e N é o comprimento atual do array.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do array |
|
|
Um ou mais elementos JSON a serem acrescentados |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
O novo comprimento do array |
|
Chave não encontrada |
|
Exemplo — acrescentar múltiplos elementos a um array:
Primeiro, crie o documento:
JSON.SET doc . '{"id": [1,2,3]}'
Acrescente null, false e true ao array id. O array cresce de 3 para 6 elementos:
JSON.ARRAPPEND doc .id null false true
Saída esperada:
(integer) 6
JSON.ARRPOP
Sintaxe: JSON.ARRPOP key path [index]
Remove e retorna o elemento no índice especificado de um array. A complexidade de tempo é O(M×N), onde M é o número de elementos filhos na chave e N é o comprimento do array.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do array |
|
|
Índice do elemento a ser removido. Começa em |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
O elemento removido |
|
Array vazio |
|
Exemplo — remover o primeiro elemento de um array:
Primeiro, crie o documento:
JSON.SET doc . '{"id": [1,2,3]}'
Remova e retorne o elemento no índice 0 (o primeiro elemento, 1):
JSON.ARRPOP doc .id 0
Saída esperada:
"1"
JSON.ARRINSERT
Sintaxe: JSON.ARRINSERT key path [index] json [json ...]
Insere um ou mais elementos JSON em um array antes do índice especificado. A complexidade de tempo é O(M×N), onde M é o número de elementos a inserir e N é o comprimento atual do array.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do array |
|
|
Posição antes da qual inserir. Começa em |
|
|
Um ou mais elementos JSON a serem inseridos |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
O novo comprimento do array |
|
Array vazio |
|
Exemplo — inserir elementos no início de um array:
Primeiro, crie o documento:
JSON.SET doc . '{"id": [1,2,3]}'
Insira 10 e 15 antes do índice 0. O array resultante é [10, 15, 1, 2, 3]:
JSON.ARRINSERT doc .id 0 10 15
Saída esperada:
(integer) 5
JSON.ARRLEN
Sintaxe: JSON.ARRLEN key path
Retorna o número de elementos em um array.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do array |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
Comprimento do array |
|
Chave não encontrada |
|
Exemplo — obter o comprimento de um array:
Primeiro, crie o documento:
JSON.SET doc . '{"id": [1,2,3]}'
Obtenha o número de elementos no array id:
JSON.ARRLEN doc .id
Saída esperada:
(integer) 3
JSON.ARRTRIM
Sintaxe: JSON.ARRTRIM key path start stop
Reduz um array para que apenas os elementos dentro do intervalo [start, stop] (inclusivo) sejam mantidos. Todos os elementos fora desse intervalo são removidos.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do array |
|
|
Índice inicial (base 0, inclusivo) |
|
|
Índice final (base 0, inclusivo) |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
Comprimento do array após a redução |
|
Chave não encontrada |
|
Exemplo — reduzir um array a um subintervalo:
Primeiro, crie o documento:
JSON.SET doc . '{"id": [1,2,3,4,5,6]}'
Reduza o array para manter apenas os elementos nos índices 3 e 4 (valores 4 e 5). Os elementos fora desse intervalo são descartados:
JSON.ARRTRIM doc .id 3 4
Saída esperada — 2 elementos permanecem:
(integer) 2
JSONPath
JSON.GET oferece suporte à sintaxe JSONPath RFC draft-4 para consultas flexíveis. O suporte completo a JSONPath exige a versão 1.8.4 ou posterior.
Seletores compatíveis:
|
Seletor |
Descrição |
||
|
|
Elemento raiz |
||
|
|
Elemento atual |
||
|
|
Elemento filho |
||
|
|
Elementos descendentes |
||
|
|
Wildcard — todos os elementos filhos ou de array |
||
|
|
Índice de array (base 0); aceita listas ( |
||
|
|
Seletor de fatia de array |
||
|
|
Seletor de filtro |
||
|
|
Expressão; prioridade de operadores: `( ) > && > |
` |
Exemplos de consulta:
Os exemplos a seguir utilizam este documento de livraria. Crie-o primeiro:
JSON.SET dockey $
'{
"store": {
"book": [{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}'
Saída esperada:
OK
Root selector
Consulte o objeto JSON completo:
JSON.GET dockey $
Saída esperada:
"[{"store":{"book":[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],"bicycle":{"color":"red","price":19.95}}}]"
Dot selector
Consulte todos os campos da bicicleta:
JSON.GET dockey $.store.bicycle.*
Saída esperada:
"["red",19.95]"
Consulte o preço da bicicleta:
JSON.GET dockey $.store.bicycle.price
Saída esperada:
"[19.95]"
Index selector
Consulte todos os campos do primeiro livro:
JSON.GET dockey $.store.book[0]
Saída esperada:
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95}]"
Consulte os títulos de todos os livros:
JSON.GET dockey "$.store.book[*]['title']"
Saída esperada:
"["Sayings of the Century","Sword of Honour","Moby Dick","The Lord of the Rings"]"
Array slice selector
Consulte os três primeiros livros usando uma fatia com passo 1:
JSON.GET dockey $.store.book[0:2:1]
Saída esperada:
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}]"
Descendant selector
Consulte todos os preços na loja (tanto livros quanto bicicleta):
JSON.GET dockey $..price
Saída esperada:
"[8.95,12.99,8.99,22.99,19.95]"
List selector
Consulte o primeiro e o terceiro livros:
JSON.GET dockey $.store.book[0,2]
Saída esperada:
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}]"
Filter selector
Consulte os livros que possuem o campo isbn:
JSON.GET dockey $.store.book[?(@.isbn)]
Saída esperada:
"[{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]"
Consulte os livros com preço abaixo de 10:
JSON.GET dockey '$.store.book[?(@.price < 10)]'
Saída esperada:
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}]"
Consulte os livros com preço igual a 12.99, preço acima de 19.95 ou na categoria reference (expressão combinada):
JSON.GET dockey "$..book[?((@.price == 12.99 || @.price > $.store.bicycle.price) || @.category == 'reference')]"
Saída esperada:
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}]"
JSON Pointer
O TairDoc oferece suporte completo à sintaxe JSON Pointer (RFC 6901). Use caminhos delimitados por / para navegar dentro de um documento.
Exemplo — recuperar um elemento de array aninhado:
Primeiro, crie o documento:
JSON.SET doc . '{"foo": "bar", "baz" : [1,2,3]}'
Recupere o primeiro elemento do array baz usando o caminho JSON Pointer /baz/0:
JSON.GET doc /baz/0
Saída esperada:
"1"