Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
JSONDescripción general de los tipos de datos
MemoryDB admite varios comandos de Valkey y Redis para trabajar con el tipo de datos. OSS JSON A continuación se presenta una descripción general del JSON tipo de datos y una lista detallada de los comandos compatibles.
Terminología
Plazo | Descripción |
---|---|
JSONdocumento |
se refiere al valor de una JSON clave |
JSONvalor |
hace referencia a un subconjunto de un JSON documento, incluida la raíz que representa todo el documento. Un valor podría ser un contenedor o una entrada dentro de un contenedor |
JSONelemento |
equivalente al JSON valor |
JSONEstándar compatible
JSONEl formato cumple con los estándares de intercambio de JSON datos RFC7159
Elemento raíz
El elemento raíz puede ser de cualquier tipo de JSON datos. Tenga en cuenta que en la versión anterior a la versión RFC 4627, solo se permitían objetos o matrices como valores raíz. Desde la actualización a la versión RFC 7159, la raíz de un JSON documento puede ser de cualquier tipo JSON de datos.
Límite de tamaño del documento
JSONlos documentos se almacenan internamente en un formato optimizado para un acceso y una modificación rápidos. Este formato suele consumir algo más de memoria que la representación serializada equivalente del mismo documento. El consumo de memoria de un único JSON documento está limitado a 64 MB, que es el tamaño de la estructura de datos en memoria, no de la JSON cadena. La cantidad de memoria que consume un JSON documento se puede inspeccionar mediante el JSON.DEBUG MEMORY
comando.
JSON ACLs
JSONel tipo de datos está totalmente integrado en la capacidad de las listas de control de OSS acceso
() de Valkey y Redis. ACL De forma similar a las categorías existentes por tipo de datos (@string, @hash, etc.), se ha agregado una nueva categoría @json para simplificar la administración del acceso a los comandos y los datos. JSON Ningún otro OSS comando de Valkey o Redis existente forma parte de la categoría @json. Todos los JSON comandos imponen restricciones y permisos de espacio de teclas o comandos. Existen cinco ACL categorías que se actualizan para incluir los nuevos JSON comandos: @read, @write, @fast, @slow y @admin. La siguiente tabla indica la asignación de JSON los comandos a las categorías correspondientes.
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 |
Límite de profundidad de anidado
Cuando un JSON objeto o matriz tiene un elemento que es en sí mismo otro JSON objeto o matriz, se dice que ese objeto o matriz interior «anida» dentro del objeto o matriz exterior. El límite máximo de profundidad de anidamiento es 128. Cualquier intento de crear un documento que contenga una profundidad de anidamiento superior a 128 se rechazará con un error.
Sintaxis de comandos
La mayoría de los comandos requieren un nombre clave de OSS Valkey o Redis como primer argumento. Algunos comandos también tienen un argumento ruta. El argumento de ruta se establece de manera predeterminada en la raíz si es opcional y no se proporciona.
Notación:
Los argumentos obligatorios se incluyen entre corchetes angulares, ej. <clave>
Los argumentos opcionales deben ir entre corchetes, ej. [ruta]
Los argumentos opcionales adicionales se indican con..., por ejemplo, [json...]
Sintaxis de ruta
JSONpara Valkey y Redis OSS admite dos tipos de sintaxis de rutas:
Sintaxis mejorada: sigue la JSONPath sintaxis descrita por Goessner
, como se muestra en la siguiente tabla. Hemos reordenado y modificado las descripciones de la tabla para mayor claridad. Sintaxis restringida: tiene capacidades de consulta limitadas.
nota
Los resultados de algunos comandos son sensibles al tipo de sintaxis de ruta que se utiliza.
Si una ruta de consulta comienza por '$', utiliza la sintaxis mejorada. De lo contrario, se utiliza la sintaxis restringida.
Sintaxis mejorada
Símbolo o expresión | Descripción |
---|---|
$ |
el elemento raíz |
. o bien [] |
operador secundario |
.. |
descenso recursivo |
* |
comodín. Todos los elementos de un objeto o matriz. |
[] |
operador de subíndice de matriz. El índice se basa en 0. |
[,] |
operador de unión |
[start:end:step] |
operador de segmento de la matriz |
?() |
aplica una expresión de filtro (script) a la matriz u objeto actual |
() |
expresión de filtro |
@ |
se usa en expresiones de filtro que hacen referencia al nodo actual que se está procesando |
== |
igual a, se utiliza en las expresiones de filtro. |
!= |
no es igual a, se utiliza en las expresiones de filtro. |
> |
mayor que, se utiliza en las expresiones de filtro. |
>= |
mayor o igual que, se utiliza en las expresiones de filtro. |
< |
menor que, se utiliza en expresiones de filtro. |
<= |
menor o igual que, se utiliza en las expresiones de filtro. |
&& |
lógicoAND, se utiliza para combinar varias expresiones de filtro. |
|| |
O lógico, se utiliza para combinar varias expresiones de filtro. |
Ejemplos
Los siguientes ejemplos se basan en los XML datos de ejemplo 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 } } }
Ruta | Descripción |
---|---|
$.store.book[*].author |
los autores de todos los libros de la tienda |
$..author |
todos los autores |
$.store.* |
todos los miembros de la tienda |
$.store.* |
todos los miembros de la tienda |
$.store..price |
el precio de todo lo que hay en la tienda |
$..* |
todos los miembros recursivos de la estructura JSON |
$..book[*] |
todos los libros |
$..book[0] |
el primer libro |
$..book[-1] |
el último libro |
$..book[0:2] |
los dos primeros libros |
$..book[0,1] |
los dos primeros libros |
$..book[0:4] |
los libros del índice 0 al 3 (el índice final no está incluido) |
$..book[0:4:2] |
los libros en el índice 0, 2 |
$..book[?(@.isbn)] |
todos los libros con un número de isbn |
$..book[?(@.price<10)] |
todos los libros que cuestan menos de 10 dólares |
'$..book[?(@.price < 10)]' |
todos los libros que cuestan menos de 10 dólares. (La ruta debe estar entre comillas si contiene espacios en blanco). |
'$..book[?(@["price"] < 10)]' |
todos los libros que cuestan menos de 10 dólares |
'$..book[?(@.["price"] < 10)]' |
todos los libros que cuestan menos de 10 dólares |
$..book[?(@.price>=10&&@.price<=100)] |
todos los libros en el rango de precios de 10 a 100 dólares, incluidos |
'$..book[?(@.price>=10 && @.price<=100)]' |
todos los libros en el rango de precios de 10 a 100 dólares, incluidos. (La ruta debe estar entre comillas si contiene espacios en blanco). |
$..book[?(@.sold==true||@.in-stock==false)] |
todos los libros vendidos o agotados |
'$..book[?(@.sold == true || @.in-stock == false)]' |
todos los libros vendidos o agotados. (La ruta debe estar entre comillas si contiene espacios en blanco). |
'$.store.book[?(@.["category"] == "fiction")]' |
todos los libros de la categoría Ficción |
'$.store.book[?(@.["category"] != "fiction")]' |
todos los libros de las categorías que no sean Ficción |
Más ejemplos de expresiones 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]"
Sintaxis restringida
Símbolo o expresión | Descripción |
---|---|
. o bien [] |
operador secundario |
[] |
operador de subíndice de matriz. El índice se basa en 0. |
Ejemplos
Ruta | Descripción |
---|---|
.store.book[0].author |
el autor del primer libro |
.store.book[-1].author |
el autor del último libro |
.address.city |
nombre de la ciudad |
["store"]["book"][0]["title"] |
el título del primer libro |
["store"]["book"][-1]["title"] |
el título del último libro |
nota
Todo el contenido de Goessner
Prefijos comunes de errores
Cada mensaje de error tiene un prefijo. A continuación se muestra una lista de prefijos comunes de errores:
Prefix | Descripción |
---|---|
ERR |
un error general |
LIMIT |
Se ha superado el error de tamaño máximo. Por ejemplo, se ha superado el límite de tamaño del documento o el límite de profundidad de anidación |
NONEXISTENT |
una clave o ruta no existe |
OUTOFBOUNDARIES |
un índice de matrices fuera de los límites |
SYNTAXERR |
error de sintaxis |
WRONGTYPE |
tipo de valor incorrecto |
JSONmétricas relacionadas
Se proporcionan las siguientes métricas de JSON información:
Información | Descripción |
---|---|
json_total_memory_bytes |
memoria total asignada a los JSON objetos |
json_num_documents |
número total de documentos en el motor Valkey o Redis OSS |
Para consultar las métricas principales, ejecute el comando:
info json_core_metrics
Cómo interactúa MemoryDB con JSON
A continuación, se ilustra cómo interactúa MemoryDB con el tipo de datos. JSON
Jerarquía de los operadores
Al evaluar las expresiones condicionales para el filtrado, las &&s tienen prioridad y, a continuación, se evalúan las ||s, como es común en la mayoría de los idiomas. Las operaciones entre paréntesis se ejecutarán primero.
Comportamiento del límite máximo de anidación
El límite máximo de anidación de rutas de MemoryDB es 128. Así que un valor como $.a.b.c.d...
solo puede alcanzar 128 niveles.
Administración de valores numéricos
JSONno tiene tipos de datos separados para números enteros y números de punto flotante. Todos se llaman números.
Cuando se recibe un JSON número, se almacena en uno de los dos formatos. Si el número cabe en un entero con signo de 64 bits, se convierte a ese formato; de lo contrario, se almacena como una cadena. Operaciones aritméticas con dos JSON números (p. ej. JSON NUMINCRBYy. JSON NUMMULTBY) intentan preservar la mayor precisión posible. Si los dos operandos y el valor resultante caben en un entero con signo de 64 bits, se realiza la aritmética de enteros. De lo contrario, los operandos de entrada se convierten en números de coma flotante de IEEE doble precisión de 64 bits, se realiza la operación aritmética y el resultado se convierte de nuevo en una cadena.
Comandos aritméticos NUMINCRBY
y NUMMULTBY
:
Si ambos números son números enteros y el resultado está fuera del rango de int64, se convierte automáticamente en un número de punto flotante de doble precisión.
Si al menos uno de los números es un número de punto flotante, el resultado es un número de punto flotante de doble precisión.
Si el resultado supera el rango de doble, el comando devolverá un error
OVERFLOW
.
nota
Antes de la versión 6.2.6.R2 OSS del motor Redis, cuando se recibía un JSON número en la entrada, se convertía en una de las dos representaciones binarias internas: un entero con signo de 64 bits o un punto flotante de doble precisión de 64 bits. IEEE No se retiene la cadena original ni nada de su formato. Por lo tanto, cuando se genera un número como parte de una JSON respuesta, se convierte de la representación binaria interna a una cadena imprimible que utiliza reglas de formato genéricas. Estas reglas podrían dan como resultado que se genere una cadena diferente de la que se recibió.
Si ambos números son enteros y el resultado está fuera del rango de
int64
, se convierte automáticamente en un número de coma flotante de IEEE doble precisión de 64 bits.Si al menos uno de los números es un punto flotante, el resultado es un número de coma flotante de IEEE doble precisión de 64 bits.
Si el resultado supera el intervalo de 64 bits IEEE dobles, el comando devuelve un
OVERFLOW
error.
Para obtener una lista de los comandos disponibles, consulte el Comandos de la admitidos.
Evaluación de sintaxis estricta
MemoryDB no permite JSON rutas con una sintaxis no válida, incluso si un subconjunto de la ruta contiene una ruta válida. Esto es para mantener un comportamiento correcto para nuestros clientes.