O TairDoc é uma estrutura de dados para documentos semelhante ao RedisJSON. Use o TairDoc 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) por meio de
JSON.GET; seletores específicos, como curinga 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 por meio de
JSON.GET
Notas de versão:
Lançamos o TairDoc junto com as instâncias otimizadas para memória do Tair. Ele suporta a sintaxe JSON Pointer completa e a sintaxe JSONPath parcial (somente o
JSON.GETé compatível com a sintaxe JSONPath).Em 17 de maio de 2022, lançamos o TairDoc V1.8.4 com suporte total a JSONPath para
JSON.GET, incluindo os seletores de curinga de ponto, índice e filtro. Recomendamos atualizar a versão secundária da sua instância para 1.8.4 ou posterior.
Pré-requisitos
Antes de começar, certifique-se de ter:
Uma DRAM-based instance do Tair
Versão secundária da instância 1.8.4 ou posterior (necessária para suporte total a JSONPath por meio de
JSON.GET)
Para atualizar sua instância para a versão secundária mais recente, consulte Update the minor version of an instance.
Para instâncias em cluster ou com divisão de leitura e escrita, atualize os nós de proxy para a versão secundária mais recente para garantir que todos os comandos funcionem conforme o esperado.
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) |
|
|
Obtém 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) |
|
|
Anexa uma string a um elemento de string JSON |
O(N) |
|
|
Obtém o comprimento de um elemento de string JSON |
O(N) |
|
|
Anexa 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 determinado índice em um array |
O(M×N) |
|
|
Obtém o comprimento de um array |
O(N) |
|
|
Recorta um array para 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 repetível
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, atualiza o elemento.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho dentro da chave. Use |
|
|
O elemento JSON a ser armazenado |
|
|
Grava apenas se o caminho não existir |
|
|
Grava apenas 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 uma 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. Suporta as sintaxes JSONPath e JSON Pointer.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho dentro da chave. Aceita as sintaxes JSONPath (estilo |
|
|
Formato de saída: |
|
|
Nome da tag para o elemento raiz na saída XML. Válido apenas quando |
|
|
Nome da tag para elementos de array na saída XML. Válido apenas 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 o nome da tag raiz e ARR como o nome da tag do 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, exclui a chave inteira. Não executa nenhuma ação e não retorna erro se a chave ou o caminho não existir.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do elemento a ser excluído. Se omitido, exclui a chave inteira |
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. Suporta a adição de novos valores, a atualização de valores existentes e a exclusão de valores no caminho especificado.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho para mesclagem. 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 analisar 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 (isso o exclui), atualize f2.a, adicione f2.b e adicione 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 .. O patch de mesclagem remove a chave f1 porque definir um campo como null 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. Tanto o elemento existente quanto o valor de 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
Anexa uma string ao elemento de string JSON no caminho especificado. Tanto o elemento existente quanto o valor anexado devem ser do tipo string.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do elemento de string |
|
|
A string a ser anexada |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
O novo comprimento da string |
|
Chave não encontrada |
|
Exemplo — anexar a um campo de string:
Primeiro, crie o documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Anexe rrrrr a foo — "bar" se torna "barrrrrr", que possui 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 de string JSON no caminho especificado. O elemento deve ser do tipo string.
Parâmetros:
|
Parâmetro |
Descrição |
|
|
A chave TairDoc |
|
|
Caminho do elemento de string |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
Comprimento da string |
|
Chave não encontrada |
|
Exemplo — obter o comprimento de um campo de string:
Primeiro, crie o documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Obtenha o comprimento de foo — "bar" possui 3 caracteres:
JSON.STRLEN doc .foo
Saída esperada:
(integer) 3
JSON.ARRAPPEND
Sintaxe: JSON.ARRAPPEND key path json [json ...]
Anexa 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 serem anexados 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 anexados |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Sucesso |
O novo comprimento do array |
|
Chave não encontrada |
|
Exemplo — anexar vários elementos a um array:
Primeiro, crie o documento:
JSON.SET doc . '{"id": [1,2,3]}'
Anexe null, false e true ao array id. O array passa 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 em 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 |
|
O array está 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 serem inseridos 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 |
|
O array está 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
Recorta um array para manter apenas os elementos dentro do intervalo [start, stop] (inclusivo) e remove todos os elementos fora desse intervalo.
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 o recorte |
|
Chave não encontrada |
|
Exemplo — recortar um array para um subintervalo:
Primeiro, crie o documento:
JSON.SET doc . '{"id": [1,2,3,4,5,6]}'
Recorte 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
O JSON.GET aceita a sintaxe JSONPath RFC draft-4 para consultas flexíveis. O suporte total a JSONPath requer a versão 1.8.4 ou posterior.
Seletores aceitos:
|
Seletor |
Descrição |
|
|
Elemento raiz |
|
|
Elemento atual |
|
|
Elemento filho |
|
|
Elementos descendentes |
|
|
Curinga — 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 do operador: |
Exemplos de consulta:
Os exemplos a seguir usam este documento de uma 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
Seletor raiz
Consulte o objeto JSON inteiro:
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}}}]"
Seletor de ponto
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]"
Seletor de índice
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"]"
Seletor de fatia de array
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}]"
Seletor de descendentes
Consulte todos os preços na loja (livros e bicicleta):
JSON.GET dockey $..price
Saída esperada:
"[8.95,12.99,8.99,22.99,19.95]"
Seletor de lista
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}]"
Seletor de filtro
Consulte livros que possuem um 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 livros com preço inferior a 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 livros com preço de 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 suporta totalmente a sintaxe JSON Pointer (RFC 6901). Use caminhos delimitados por / para navegar em 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"