TairDoc es una estructura de datos de documentos similar a RedisJSON. Úsela para almacenar, consultar y manipular documentos JSON con compatibilidad completa para operaciones CRUD.
Características principales:
Compatibilidad total con el estándar JSON
Compatibilidad con JSONPath (borrador RFC-4) mediante
JSON.GET; los selectores específicos, como el comodín de punto, el índice y los filtros, requieren la versión 1.8.4 o posteriorCompatibilidad completa con la sintaxis de JSON Pointer (RFC 6901)
Almacenamiento en árbol binario para recuperar elementos secundarios de forma eficiente
Conversión de JSON a XML y de JSON a YAML mediante
JSON.GET
Notas de la versión:
TairDoc se lanzó junto con las instancias optimizadas para memoria de Tair. Admite la sintaxis completa de JSONPointer y una sintaxis parcial de JSONPath (solo
JSON.GETadmite la sintaxis JSONPath).El 17 de mayo de 2022 se publicó TairDoc V1.8.4 con compatibilidad total de JSONPath para
JSON.GET, incluido el selector de comodín de punto, el selector de índice y el selector de filtro. Se recomienda actualizar la versión secundaria de su instancia a la 1.8.4 o posterior.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una instancia basada en DRAM de Tair
Versión secundaria de la instancia 1.8.4 o posterior (obligatoria para la compatibilidad total con JSONPath mediante
JSON.GET)
Para actualizar su instancia a la última versión secundaria, consulte Actualizar la versión secundaria de una instancia.
En instancias de clúster o con división de lectura/escritura, actualice los nodos de proxy a la última versión secundaria para garantizar que todos los comandos funcionen correctamente.
Lista de comandos
|
Comando |
Descripción |
Complejidad temporal |
|
Cree una clave de TairDoc o actualice un elemento JSON en una ruta |
O(N) |
|
|
Recupere un elemento JSON de una ruta |
O(N) |
|
|
Elimine un elemento JSON o una clave |
O(N) |
|
|
Obtenga el tipo de un elemento JSON |
O(N) |
|
|
Combine un valor JSON en una ruta |
O(N) |
|
|
Incremente un elemento JSON numérico |
O(N) |
|
|
Agregue una cadena al final de un elemento de cadena JSON |
O(N) |
|
|
Obtenga la longitud de un elemento de cadena JSON |
O(N) |
|
|
Agregue elementos al final de un arreglo |
O(M×N) |
|
|
Extraiga y devuelva un elemento de un arreglo |
O(M×N) |
|
|
Inserte elementos antes de un índice dado en un arreglo |
O(M×N) |
|
|
Obtenga la longitud de un arreglo |
O(N) |
|
|
Recorte un arreglo a un rango especificado |
O(N) |
|
|
Elimine una o más claves de TairDoc (comando nativo de Redis) |
— |
Convenciones de sintaxis utilizadas en esta referencia:
MAYÚSCULAS: palabra clave del comando_cursiva_: variable[opción]: parámetro opcionalA | B: opciones mutuamente excluyentes...: el parámetro se puede repetir
JSON.SET
Sintaxis: JSON.SET key path json [NX | XX]
Crea una clave de TairDoc y almacena un elemento JSON en la ruta especificada. Si la clave y la ruta ya existen, actualiza el elemento.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta dentro de la clave. Use |
|
|
El elemento JSON que se va a almacenar |
|
|
Escriba solo si la ruta no existe |
|
|
Escriba solo si la ruta ya existe |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
|
|
Se especificó |
|
|
Se especificó |
|
|
Ruta no válida |
|
Ejemplo: crear un documento JSON:
El siguiente comando crea una clave doc en la ruta raíz ($) y almacena un documento de librería con cuatro libros y una 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 } } }'
Salida esperada:
OK
JSON.GET
Sintaxis: JSON.GET key path [FORMAT XML | YAML] [ROOTNAME root] [ARRNAME arr]
Recupera el elemento JSON en la ruta especificada. Admite tanto la sintaxis JSONPath como JSON Pointer.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta dentro de la clave. Acepta sintaxis JSONPath (estilo |
|
|
Formato de salida: |
|
|
Nombre de etiqueta para el elemento raíz en la salida XML. Válido solo cuando se establece |
|
|
Nombre de etiqueta para los elementos del arreglo en la salida XML. Válido solo cuando se establece |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
El elemento JSON en la ruta especificada |
|
Error |
Mensaje de error |
Ejemplo: recuperar un documento como XML:
Primero, cree el documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Luego, recupérelo como XML y especifique ROOT como nombre de la etiqueta raíz y ARR como nombre de la etiqueta del arreglo:
JSON.GET doc . FORMAT XML ROOTNAME ROOT ARRNAME ARR
Salida esperada:
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><ROOT><foo>bar</foo><baz>42</baz></ROOT>"
JSON.DEL
Sintaxis: JSON.DEL key path
Elimina el elemento JSON en la ruta especificada. Si no se proporciona ninguna ruta, elimina toda la clave. No realiza ninguna acción si la clave o la ruta no existen.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta del elemento que se va a eliminar. Si se omite, se elimina toda la clave |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
|
|
Clave o ruta no encontrada |
|
Ejemplo: eliminar un campo:
Primero, cree el documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Elimine el campo foo:
JSON.DEL doc .foo
Salida esperada: 1 indica que el elemento se eliminó:
(integer) 1
JSON.TYPE
Sintaxis: JSON.TYPE key path
Devuelve el tipo del elemento JSON en la ruta especificada.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta del elemento |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
Uno de los siguientes: |
|
Con errores |
|
|
Clave o ruta no encontrada |
|
Ejemplo: obtener el tipo de un campo:
Primero, cree el documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Obtenga el tipo del campo foo ("bar" es una cadena):
JSON.TYPE doc .foo
Salida esperada:
string
JSON.MERGE
Sintaxis: JSON.MERGE key path value
Combina un valor JSON en la ruta especificada. Permite agregar nuevos valores, actualizar valores existentes y eliminar valores en la ruta indicada.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta donde se combinarán los datos. Admite sintaxis parcial de JSONPath (por ejemplo, |
|
|
El valor JSON que se va a combinar. Compatible con JSON Merge Patch (RFC 7386) |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
|
|
Valor no válido |
Error (falló el análisis sintáctico del parche de combinación) |
Ejemplo: agregar, actualizar y eliminar valores en una sola operación:
Primero, cree el documento:
JSON.SET doc $ '{"f1": {"a":1}, "f2":{"a":2}}'
Combine los cambios: establezca f1 en null (lo elimina), actualice f2.a y agregue f2.b, además de añadir un nuevo arreglo f3:
JSON.MERGE doc $ '{"f1": null, "f2":{"a":3, "b":4}, "f3":[2,4,6]}'
Salida esperada:
OK
Compruebe el resultado con JSON.GET doc .. La clave f1 se elimina porque establecer un campo en null dentro de un parche de combinación lo borra:
"{\"f2\":{\"a\":3,\"b\":4},\"f3\":[2,4,6]}"
JSON.NUMINCRBY
Sintaxis: JSON.NUMINCRBY key path value
Incrementa el elemento JSON numérico en la ruta especificada. Tanto el elemento existente como el valor de incremento deben ser del mismo tipo: entero o doble.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta del elemento numérico |
|
|
La cantidad que se va a sumar |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
El nuevo valor después del incremento |
|
Clave o ruta no encontrada |
Error |
Ejemplo: incrementar un campo numérico:
Primero, cree el documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Incremente baz en 10 (42 + 10 = 52):
JSON.NUMINCRBY doc .baz 10
Salida esperada:
"52"
JSON.STRAPPEND
Sintaxis: JSON.STRAPPEND key path json-string
Agrega una cadena al final del elemento de cadena JSON en la ruta especificada. Tanto el elemento existente como el valor agregado deben ser del tipo string.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta del elemento de cadena |
|
|
La cadena que se va a agregar |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
La nueva longitud de la cadena |
|
Clave no encontrada |
|
Ejemplo: agregar texto a un campo de cadena:
Primero, cree el documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Agregue rrrrr a foo: "bar" se convierte en "barrrrrr", que tiene 8 caracteres:
JSON.STRAPPEND doc .foo rrrrr
Salida esperada:
(integer) 8
JSON.STRLEN
Sintaxis: JSON.STRLEN key path
Devuelve la longitud en caracteres del elemento de cadena JSON en la ruta especificada. El elemento debe ser del tipo string.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta del elemento de cadena |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
Longitud de la cadena |
|
Clave no encontrada |
|
Ejemplo: obtener la longitud de un campo de cadena:
Primero, cree el documento:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Obtenga la longitud de foo: "bar" tiene 3 caracteres:
JSON.STRLEN doc .foo
Salida esperada:
(integer) 3
JSON.ARRAPPEND
Sintaxis: JSON.ARRAPPEND key path json [json ...]
Agrega uno o más elementos JSON al final de un arreglo. La complejidad temporal es O(M×N), donde M es el número de elementos por agregar y N es la longitud actual del arreglo.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta del arreglo |
|
|
Uno o más elementos JSON que se van a agregar |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
La nueva longitud del arreglo |
|
Clave no encontrada |
|
Ejemplo: agregar varios elementos a un arreglo:
Primero, cree el documento:
JSON.SET doc . '{"id": [1,2,3]}'
Agregue null, false y true al arreglo id. El arreglo pasa de 3 a 6 elementos:
JSON.ARRAPPEND doc .id null false true
Salida esperada:
(integer) 6
JSON.ARRPOP
Sintaxis: JSON.ARRPOP key path [index]
Extrae y devuelve el elemento en el índice especificado de un arreglo. La complejidad temporal es O(M×N), donde M es el número de elementos secundarios en la clave y N es la longitud del arreglo.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta del arreglo |
|
|
Índice del elemento que se va a extraer. Comienza en |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
El elemento extraído |
|
El arreglo está vacío |
|
Ejemplo: extraer el primer elemento de un arreglo:
Primero, cree el documento:
JSON.SET doc . '{"id": [1,2,3]}'
Extraiga y devuelva el elemento en el índice 0 (el primer elemento, 1):
JSON.ARRPOP doc .id 0
Salida esperada:
"1"
JSON.ARRINSERT
Sintaxis: JSON.ARRINSERT key path [index] json [json ...]
Inserta uno o más elementos JSON en un arreglo antes del índice especificado. La complejidad temporal es O(M×N), donde M es el número de elementos por insertar y N es la longitud actual del arreglo.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta del arreglo |
|
|
Posición antes de la cual se insertarán los elementos. Comienza en |
|
|
Uno o más elementos JSON que se van a insertar |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
La nueva longitud del arreglo |
|
El arreglo está vacío |
|
Ejemplo: insertar elementos al inicio de un arreglo:
Primero, cree el documento:
JSON.SET doc . '{"id": [1,2,3]}'
Inserte 10 y 15 antes del índice 0. El arreglo resultante es [10, 15, 1, 2, 3]:
JSON.ARRINSERT doc .id 0 10 15
Salida esperada:
(integer) 5
JSON.ARRLEN
Sintaxis: JSON.ARRLEN key path
Devuelve el número de elementos en un arreglo.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta del arreglo |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
Longitud del arreglo |
|
Clave no encontrada |
|
Ejemplo: obtener la longitud de un arreglo:
Primero, cree el documento:
JSON.SET doc . '{"id": [1,2,3]}'
Obtenga el número de elementos en el arreglo id:
JSON.ARRLEN doc .id
Salida esperada:
(integer) 3
JSON.ARRTRIM
Sintaxis: JSON.ARRTRIM key path start stop
Recorta un arreglo para que solo permanezcan los elementos dentro del rango [start, stop] (inclusive). Todos los elementos fuera de este rango se eliminan.
Parámetros:
|
Parámetro |
Descripción |
|
|
La clave de TairDoc |
|
|
Ruta del arreglo |
|
|
Índice inicial (base 0, inclusivo) |
|
|
Índice final (base 0, inclusivo) |
Valores de retorno:
|
Resultado |
Valor de retorno |
|
Correcto |
Longitud del arreglo después del recorte |
|
Clave no encontrada |
|
Ejemplo: recortar un arreglo a un subrango:
Primero, cree el documento:
JSON.SET doc . '{"id": [1,2,3,4,5,6]}'
Recorte el arreglo para conservar solo los elementos en los índices 3 y 4 (valores 4 y 5). Los elementos fuera de este rango se descartan:
JSON.ARRTRIM doc .id 3 4
Salida esperada: permanecen 2 elementos:
(integer) 2
JSONPath
JSON.GET admite la sintaxis del borrador RFC-4 de JSONPath para realizar consultas flexibles. La compatibilidad total con JSONPath requiere la versión 1.8.4 o posterior.
Selectores admitidos:
|
Selector |
Descripción |
||
|
|
Elemento raíz |
||
|
|
Elemento actual |
||
|
|
Elemento secundario |
||
|
|
Elementos descendientes |
||
|
|
Comodín: todos los elementos secundarios o del arreglo |
||
|
|
Índice de arreglo (base 0); admite listas ( |
||
|
|
Selector de segmento de arreglo |
||
|
|
Selector de filtro |
||
|
|
Expresión; prioridad de operadores: `( ) > && > |
` |
Ejemplos de consultas:
Los siguientes ejemplos utilizan este documento de librería. Créelo primero:
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
}'
Salida esperada:
OK
Selector de raíz
Consulte todo el objeto JSON:
JSON.GET dockey $
Salida 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}}}]"
Selector de punto
Consulte todos los campos de la bicicleta:
JSON.GET dockey $.store.bicycle.*
Salida esperada:
"["red",19.95]"
Consulte el precio de la bicicleta:
JSON.GET dockey $.store.bicycle.price
Salida esperada:
"[19.95]"
Selector de índice
Consulte todos los campos del primer libro:
JSON.GET dockey $.store.book[0]
Salida esperada:
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95}]"
Consulte los títulos de todos los libros:
JSON.GET dockey "$.store.book[*]['title']"
Salida esperada:
"["Sayings of the Century","Sword of Honour","Moby Dick","The Lord of the Rings"]"
Selector de segmento de arreglo
Consulte los primeros tres libros mediante un segmento con paso de 1:
JSON.GET dockey $.store.book[0:2:1]
Salida 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}]"
Selector de descendientes
Consulte todos los precios en la tienda (tanto libros como bicicleta):
JSON.GET dockey $..price
Salida esperada:
"[8.95,12.99,8.99,22.99,19.95]"
Selector de lista
Consulte el primer y tercer libro:
JSON.GET dockey $.store.book[0,2]
Salida 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}]"
Selector de filtro
Consulte los libros que tienen un campo isbn:
JSON.GET dockey $.store.book[?(@.isbn)]
Salida 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 los libros con precio menor a 10:
JSON.GET dockey '$.store.book[?(@.price < 10)]'
Salida 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 los libros con precio de 12.99, precio superior a 19.95 o de la categoría reference (expresión combinada):
JSON.GET dockey "$..book[?((@.price == 12.99 || @.price > $.store.bicycle.price) || @.category == 'reference')]"
Salida 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
TairDoc admite completamente la sintaxis de JSON Pointer (RFC 6901). Utilice rutas delimitadas por / para navegar dentro de un documento.
Ejemplo: recuperar un elemento anidado de un arreglo:
Primero, cree el documento:
JSON.SET doc . '{"foo": "bar", "baz" : [1,2,3]}'
Recupere el primer elemento del arreglo baz mediante la ruta JSON Pointer /baz/0:
JSON.GET doc /baz/0
Salida esperada:
"1"