

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.

# Introducción a JSON
<a name="json-gs"></a>

MemoryDB admite el formato nativo de notación de JavaScript objetos (JSON), una forma sencilla y sin esquemas de codificar conjuntos de datos complejos dentro de los clústeres OSS de Valkey o Redis. Puede almacenar y acceder a los datos de forma nativa mediante el formato de notación de JavaScript objetos (JSON) dentro de los clústeres y actualizar los datos JSON almacenados en esos clústeres, sin necesidad de gestionar un código personalizado para serializarlos y deserializarlos.

Además de utilizar Valkey o Redis OSS APIs para las aplicaciones que funcionan con JSON, ahora puede recuperar y actualizar de forma eficiente partes específicas de un documento JSON sin necesidad de manipular todo el objeto, lo que puede mejorar el rendimiento y reducir los costes. También puede buscar en el contenido de su documento JSON mediante la consulta [Estilo Goessner](https://goessner.net/articles/JsonPath/)`JSONPath`.

Después de crear un clúster con una versión de motor compatible, el tipo de datos JSON y los comandos asociados están disponibles automáticamente. Esta es una API compatible y una RDB compatible con la versión 2 del módulo RedisJSON, por lo que puede migrar fácilmente las aplicaciones de Valkey o de Redis OSS existentes basadas en JSON a MemoryDB. Para obtener más información acerca de los comandos compatibles, consulte [Comandos admitidos](json-list-commands.md).

`JsonBasedCmds`Se ha incorporado una métrica relacionada con JSON CloudWatch para supervisar el uso de este tipo de datos. Para obtener más información, consulte las [métricas de MemoryDB](https://docs.aws.amazon.com/memorydb/latest/devguide/metrics.memorydb.html).

**nota**  
Para usar JSON, debe ejecutar Valkey 7.2 o posterior, o la versión del motor de Redis OSS 6.2.6 o posterior.

**Topics**
+ [Información general del tipo de datos JSON](json-document-overview.md)
+ [Comandos admitidos](json-list-commands.md)

# Información general del tipo de datos JSON
<a name="json-document-overview"></a>

MemoryDB admite una serie de comandos de Valkey y Redis OSS para trabajar con el tipo de datos JSON. A continuación se presenta información general del tipo de datos JSON y una lista detallada de los comandos compatibles.

## Terminología
<a name="json-terminology"></a>


****  

| Plazo | Description (Descripción) | 
| --- | --- | 
|  Documento JSON | hace referencia al valor de una clave JSON | 
|  Valor JSON | hace referencia a un subconjunto de un JSON, incluida la raíz que representa a todo el documento. Un valor podría ser un contenedor o una entrada dentro de un contenedor | 
|  Elemento JSON | equivalente al valor JSON. | 

## Estándares JSON admitidos
<a name="Supported-JSON-Standard"></a>

El formato JSON es compatible con el estándar de intercambio de datos JSON [RFC 7159](https://www.ietf.org/rfc/rfc7159.txt) y [ECMA-404](https://www.ietf.org/rfc/rfc7159.txt). Se admite UTF-8 [Unicode](https://www.unicode.org/standard/WhatIsUnicode.html) en texto JSON.

## Elemento raíz
<a name="json-root-element"></a>

El elemento raíz puede ser de cualquier tipos de datos de JSON. Tenga en cuenta que en la RFC 4627 anterior, solo se permitían objetos o matrices como valores raíz. Desde la actualización a RFC 7159, la raíz de un documento JSON puede ser de cualquier tipo de datos JSON.

## Límite de tamaño del documento
<a name="json-document-size-limit"></a>

Los documentos JSON se almacenan de manera interna en un formato que se optimiza para lograr un acceso y 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 solo documento JSON está limitado a 64 MB, que es el tamaño de la estructura de datos en memoria, no la cadena JSON. La cantidad de memoria que consume un documento JSON puede examinarse mediante el uso del comando `JSON.DEBUG MEMORY`.

## JSON ACLs
<a name="json-acls"></a>
+ El tipo de datos JSON está totalmente integrado en la capacidad [Lista de control de acceso (ACL)](https://valkey.io/topics/acl/) de Valkey y Redis OSS. Similar a las categorías existentes por tipo de datos (@string, @hash, etc.), se agrega una nueva categoría @json para simplificar la administración del acceso a los comandos y datos JSON. Ningún otro comando de Valkey o Redis OSS existente es miembro de la categoría @json. Todos los comandos JSON aplican cualquier restricción y permiso de espacio de teclas o comandos.
+ Hay cinco categorías de ACL existentes que se actualizan para incluir los nuevos comandos JSON: @read, @write, @fast, @slow y @admin. La tabla a continuación indica la asignación de los comandos JSON a las categorías apropiadas.


**ACL**  

| Comando JSON | @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
<a name="json-nesting-depth-limit"></a>

Cuando un objeto o matriz JSON tiene un elemento que es otro objeto o matriz JSON, se dice que ese objeto o matriz interior se “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
<a name="json-command-syntax"></a>

La mayoría de los comandos requieren un nombre de clave de Valkey o Redis OSS 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
<a name="json-path-syntax"></a>

JSON para Valkey y Redis OSS admite dos tipos de sintaxis de ruta:
+ **Sintaxis mejorada**: sigue la JSONPath sintaxis descrita por [Goessner](https://goessner.net/articles/JsonPath/), como se muestra en la tabla siguiente. 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 '\$1', utiliza la sintaxis mejorada. De lo contrario, se utiliza la sintaxis restringida.

**Sintaxis mejorada**


****  

| Símbolo o expresión | Description (Descripción) | 
| --- | --- | 
|  \$1 | el elemento raíz | 
|  . o bien [] | operador secundario | 
|  .. | descenso recursivo | 
|  \$1 | 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. | 
|  \$1= | 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.  | 
|  && | Y lógico, se utiliza para combinar varias expresiones de filtro. | 
|  \$1\$1 | O lógico, se utiliza para combinar varias expresiones de filtro. | 

**Ejemplos**

Los siguientes ejemplos se basan en los datos XML del ejemplo de [Goessner](https://goessner.net/articles/JsonPath/), que hemos modificado agregando matrices adicionales.

```
{ "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 | Description (Descripción) | 
| --- | --- | 
|  \$1.store.book[\$1].author | los autores de todos los libros de la tienda | 
|  \$1..author | todos los autores | 
|  \$1.store.\$1 | todos los miembros de la tienda | 
|  \$1.store.\$1 | todos los miembros de la tienda | 
|  \$1.store..price | el precio de todo lo que hay en la tienda | 
|  \$1..\$1 | todos los miembros recursivos de la estructura JSON | 
|  \$1..book[\$1] | todos los libros | 
|  \$1..book[0] | el primer libro | 
|  \$1..book[-1] | el último libro | 
|  \$1..book[0:2] | los dos primeros libros | 
|  \$1..book[0,1] | los dos primeros libros | 
|  \$1..book[0:4] | los libros del índice 0 al 3 (el índice final no está incluido) | 
|  \$1..book[0:4:2] | los libros en el índice 0, 2 | 
|  \$1..book[?(@.isbn)] | todos los libros con un número de isbn | 
|  \$1..book[?(@.price<10)] | todos los libros que cuestan menos de 10 dólares | 
|  '\$1..book[?(@.price < 10)]' | todos los libros que cuestan menos de 10 dólares. (La ruta debe estar entre comillas si contiene espacios en blanco). | 
|  '\$1..book[?(@["price"] < 10)]' | todos los libros que cuestan menos de 10 dólares | 
|  '\$1..book[?(@.["price"] < 10)]' | todos los libros que cuestan menos de 10 dólares | 
|  \$1..book[?(@.price>=10&&@.price<=100)] | todos los libros en el rango de precios de 10 a 100 dólares, incluidos | 
|  '\$1..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). | 
|  \$1..book[?(@.sold==true\$1\$1@.in-stock==false)] | todos los libros vendidos o agotados | 
|  '\$1..book[?(@.sold == true \$1\$1 @.in-stock == false)]' | todos los libros vendidos o agotados. (La ruta debe estar entre comillas si contiene espacios en blanco). | 
|  '\$1.store.book[?(@.["category"] == "fiction")]' | todos los libros de la categoría Ficción | 
|  '\$1.store.book[?(@.["category"] \$1= "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 | Description (Descripción) | 
| --- | --- | 
|  . o bien [] | operador secundario | 
|  [] | operador de subíndice de matriz. El índice se basa en 0. | 

**Ejemplos**


****  

| Ruta | Description (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](https://goessner.net/articles/JsonPath/) citado en esta documentación está sujeto a la [Licencia de Creative Commons](https://creativecommons.org/licenses/by/2.5/).

## Prefijos comunes de errores
<a name="json-error-prefixes"></a>

Cada mensaje de error tiene un prefijo. A continuación se muestra una lista de prefijos comunes de errores:


****  

| Prefijo | Description (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 | 
|  INEXISTENTE | una clave o ruta no existe | 
|  FUERA DE LOS LÍMITES | un índice de matrices fuera de los límites | 
|  SYNTAXERR | error de sintaxis | 
|  WRONGTYPE | tipo de valor incorrecto | 

## Métricas relacionadas con JSON
<a name="json-info-metrics"></a>

Se proporcionan las siguientes métricas de información JSON:


****  

| Información | Description (Descripción) | 
| --- | --- | 
|  json\$1total\$1memory\$1bytes | memoria total asignada a objetos JSON | 
|  json\$1num\$1documents | el número total de documentos en el motor de 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 name="json-differences"></a>

A continuación, se ilustra cómo interactúa MemoryDB con el tipo de datos JSON.

### Jerarquía de los operadores
<a name="json-operator-precedence"></a>

Al evaluar las expresiones condicionales para el filtrado, las &&s tienen prioridad y, a continuación, se evalúan las \$1\$1s, 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
<a name="json-max-path"></a>

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
<a name="json-about-numbers"></a>

JSON no tiene tipos de datos separados para números enteros y de coma flotante. Todos se llaman números.

Cuando se recibe un número JSON, se puede almacenar en 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. Las operaciones aritméticas en dos números JSON (por ejemplo, JSON.NUMINCRBY y JSON.NUMMULTBY) intentan conservar 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 doble precisión según el IEEE 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 del motor de Redis OSS, cuando se recibía un número JSON en la entrada, este se convertía a una de las dos representaciones binarias internas: un número entero con signo de 64 bits o un número de punto flotante de doble precisión IEEE de 64 bits. No se retiene la cadena original ni nada de su formato. Por lo tanto, cuando se genera un número como parte de una respuesta JSON, se convierte de la representación binaria interna a una cadena imprimible que utiliza reglas de formato genérico. Estas reglas podrían dan como resultado que se genere una cadena diferente de la que se recibió.  
Si ambos números son números enteros y el resultado está fuera del rango de `int64`, automáticamente se convierte en un número IEEE de punto flotante de doble precisión de 64 bits.
Si al menos uno de los números es un punto flotante, el resultado es un número IEEE de punto flotante de doble precisión de 64 bits.
Si el resultado supera el rango de doble IEEE de 64 bits, el comando regresa un error `OVERFLOW`.

Para obtener una lista de los comandos disponibles, consulte el [Comandos admitidos](json-list-commands.md).

### Evaluación de sintaxis estricta
<a name="json-strict-syntax-evaluation"></a>

MemoryDB no permite rutas JSON con 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.

# Comandos admitidos
<a name="json-list-commands"></a>

Se admiten los siguientes comandos JSON:

**Topics**
+ [JSON.ARRAPPEND](json-arrappend.md)
+ [JSON.ARRINDEX](json-arrindex.md)
+ [JSON.ARRINSERT](json-arrinsert.md)
+ [JSON.ARRLEN](json-arrlen.md)
+ [JSON.ARRPOP](json-arrpop.md)
+ [JSON.ARRTRIM](json-arrtrim.md)
+ [JSON.CLEAR](json-clear.md)
+ [JSON.DEBUG](json-debug.md)
+ [JSON.DEL](json-del.md)
+ [JSON.FORGET](json-forget.md)
+ [JSON.GET](json-get.md)
+ [JSON.MGET](json-mget.md)
+ [JSON.NUMINCRBY](json-numincrby.md)
+ [JSON.NUMMULTBY](json-nummultby.md)
+ [JSON.OBJLEN](json-objlen.md)
+ [JSON.OBJKEYS](json-objkeys.md)
+ [JSON.RESP](json-resp.md)
+ [JSON.SET](json-set.md)
+ [JSON.STRAPPEND](json-strappend.md)
+ [JSON.STRLEN](json-strlen.md)
+ [JSON.TOGGLE](json-toggle.md)
+ [JSON.TYPE](json-type.md)

# JSON.ARRAPPEND
<a name="json-arrappend"></a>

Adjunta uno o varios valores a los valores de la matriz en la ruta.

Sintaxis

```
JSON.ARRAPPEND <key> <path> <json> [json ...]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (obligatoria): ruta JSON
+ json (obligatorio): valor JSON que se agregará a la matriz

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de números enteros que representan la nueva longitud de la matriz en cada ruta.
+ Si un valor no es una matriz, su valor devuelto correspondiente es nulo.
+ Error `SYNTAXERR` si uno de los argumentos json de entrada no es una cadena JSON válida.
+ Error `NONEXISTENT` si la ruta no existe.

Si la ruta es de sintaxis restringida:
+ Entero, la nueva longitud de la matriz.
+ Si se seleccionan varios valores de matriz, el comando devuelve la nueva longitud de la última matriz actualizada.
+ Error `WRONGTYPE` si el valor de la ruta no es una matriz.
+ Error `SYNTAXERR` si uno de los argumentos json de entrada no es una cadena JSON válida.
+ Error `NONEXISTENT` si la ruta no existe.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRAPPEND  k1 $[*] '"c"'
1) (integer) 1
2) (integer) 2
3) (integer) 3
127.0.0.1:6379> JSON.GET k1
"[[\"c\"],[\"a\",\"c\"],[\"a\",\"b\",\"c\"]]"
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRAPPEND  k1 [-1] '"c"'
(integer) 3
127.0.0.1:6379> JSON.GET k1
"[[],[\"a\"],[\"a\",\"b\",\"c\"]]"
```

# JSON.ARRINDEX
<a name="json-arrindex"></a>

Busca la primera aparición de un valor JSON escalar en las matrices de la ruta.
+ Los errores fuera de rango se tratan redondeando el índice al principio y al final de la matriz.
+ Si inicio > fin, devuelve -1 (no encontrado).

Sintaxis

```
JSON.ARRINDEX <key> <path> <json-scalar> [start [end]]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (obligatoria): ruta JSON
+ json-scalar (obligatorio): valor escalar que se debe buscar; el escalar JSON hace referencia a valores que no son objetos ni matrices. Es decir, las cadenas, números, booleanos y el valor nulo son escalares.
+ inicio (opcional): índice de inicio, inclusivo. Toma 0 como valor predeterminado si no se proporciona.
+ final (opcional): índice de final, exclusivo. Toma 0 como valor predeterminado si no se proporciona, lo que significa que se incluye el último elemento. 0 o -1 significa que se incluye el último elemento.

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de números enteros. Cada valor es el índice del elemento coincidente de la matriz en la ruta. El valor es -1 si no se encuentra.
+ Si un valor no es una matriz, su valor devuelto correspondiente es nulo.

Si la ruta es de sintaxis restringida:
+ Entero, el índice del elemento coincidente o -1 si no se encuentra.
+ Error `WRONGTYPE` si el valor de la ruta no es una matriz.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRINDEX k1 $[*] '"b"'
1) (integer) -1
2) (integer) -1
3) (integer) 1
4) (integer) 1
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.ARRINDEX k1 .children '"Tom"'
(integer) 2
```

# JSON.ARRINSERT
<a name="json-arrinsert"></a>

Inserta uno o varios valores en los valores de la matriz en la ruta antes del índice.

Sintaxis

```
JSON.ARRINSERT <key> <path> <index> <json> [json ...]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (obligatoria): ruta JSON
+ índice (obligatorio): índice de matriz antes del cual se insertan los valores.
+ json (obligatorio): valor JSON que se agregará a la matriz

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de números enteros que representan la nueva longitud de la matriz en cada ruta.
+ Si un valor es una matriz vacía, su valor devuelto correspondiente es nulo.
+ Si un valor no es una matriz, su valor devuelto correspondiente es nulo.
+ Error `OUTOFBOUNDARIES` si el argumento índice está fuera de los límites.

Si la ruta es de sintaxis restringida:
+ Entero, la nueva longitud de la matriz.
+ Error `WRONGTYPE` si el valor de la ruta no es una matriz.
+ Error `OUTOFBOUNDARIES` si el argumento índice está fuera de los límites.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRINSERT k1 $[*] 0 '"c"'
1) (integer) 1
2) (integer) 2
3) (integer) 3
127.0.0.1:6379> JSON.GET k1
"[[\"c\"],[\"c\",\"a\"],[\"c\",\"a\",\"b\"]]"
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRINSERT k1 . 0 '"c"'
(integer) 4
127.0.0.1:6379> JSON.GET k1
"[\"c\",[],[\"a\"],[\"a\",\"b\"]]"
```

# JSON.ARRLEN
<a name="json-arrlen"></a>

Obtiene la longitud de los valores de la matriz en la ruta.

Sintaxis

```
JSON.ARRLEN <key> [path] 
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de números enteros, que representa la longitud de la matriz en cada ruta.
+ Si un valor no es una matriz, su valor devuelto correspondiente es nulo.
+ Es nulo si la clave del documento no existe.

Si la ruta es de sintaxis restringida:
+ Matriz de cadenas a granel. Cada elemento es un nombre clave del objeto.
+ Entero, longitud de matriz.
+ Si hay varios objetos seleccionados, el comando devuelve la longitud de la primera matriz.
+ Error `WRONGTYPE` si el valor de la ruta no es una matriz.
+ Error `WRONGTYPE` si la ruta no existe.
+ Es nulo si la clave del documento no existe.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], [\"a\"], [\"a\", \"b\"], [\"a\", \"b\", \"c\"]]'
(error) SYNTAXERR Failed to parse JSON string due to syntax error
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRLEN k1 $[*]
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 3

127.0.0.1:6379> JSON.SET k2 . '[[], "a", ["a", "b"], ["a", "b", "c"], 4]'
OK
127.0.0.1:6379> JSON.ARRLEN k2 $[*]
1) (integer) 0
2) (nil)
3) (integer) 2
4) (integer) 3
5) (nil)
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRLEN k1 [*]
(integer) 0
127.0.0.1:6379> JSON.ARRLEN k1 $[3]
1) (integer) 3

127.0.0.1:6379> JSON.SET k2 . '[[], "a", ["a", "b"], ["a", "b", "c"], 4]'
OK
127.0.0.1:6379> JSON.ARRLEN k2 [*]
(integer) 0
127.0.0.1:6379> JSON.ARRLEN k2 $[1]
1) (nil)
127.0.0.1:6379> JSON.ARRLEN k2 $[2]
1) (integer) 2
```

# JSON.ARRPOP
<a name="json-arrpop"></a>

Elimina y devuelve el elemento en el índice de la matriz. Al emerger una matriz vacía, se devuelve nulo.

Sintaxis

```
JSON.ARRPOP <key> [path [index]]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona
+ índice (opcional): posición en la matriz desde la que empezar a salir.
  + El valor predeterminado es -1 si no se proporciona, lo que significa el último elemento.
  + Un valor negativo significa la posición desde el último elemento.
  + Los índices fuera de los límites se redondean a sus respectivos límites de matriz.

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de cadenas masivas que representan valores emergentes en cada ruta.
+ Si un valor es una matriz vacía, su valor devuelto correspondiente es nulo.
+ Si un valor no es una matriz, su valor devuelto correspondiente es nulo.

Si la ruta es de sintaxis restringida:
+ Cadena masiva, que representa el valor JSON emergente
+ Es nulo si la matriz está vacía.
+ Error `WRONGTYPE` si el valor de la ruta no es una matriz.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k1 $[*]
1) (nil)
2) "\"a\""
3) "\"b\""
127.0.0.1:6379> JSON.GET k1
"[[],[],[\"a\"]]"
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k1
"[\"a\",\"b\"]"
127.0.0.1:6379> JSON.GET k1
"[[],[\"a\"]]"

127.0.0.1:6379> JSON.SET k2 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k2 . 0
"[]"
127.0.0.1:6379> JSON.GET k2
"[[\"a\"],[\"a\",\"b\"]]"
```

# JSON.ARRTRIM
<a name="json-arrtrim"></a>

Recorta una matriz en la ruta para que se convierta en una submatriz [inicio, fin], ambos inclusivos.
+ Si la matriz está vacía, no se hace nada y se devuelve 0.
+ Si el valor inicio es <0, trátelo como 0.
+ Si el tamaño del valor final es >= (tamaño de la matriz), trátelo como tamaño-1.
+ Si el tamaño del valor inicio >= o inicio > final, vacíe la matriz y devuelva 0.

Sintaxis

```
JSON.ARRINSERT <key> <path> <start> <end>
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (obligatoria): ruta JSON
+ inicio (obligatorio): índice de inicio, inclusivo.
+ final (obligatorio): índice de final, inclusivo.

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de números enteros que representan la nueva longitud de la matriz en cada ruta.
+ Si un valor es una matriz vacía, su valor devuelto correspondiente es nulo.
+ Si un valor no es una matriz, su valor devuelto correspondiente es nulo.
+ Error `OUTOFBOUNDARIES` si un argumento de índice está fuera de los límites.

Si la ruta es de sintaxis restringida:
+ Entero, la nueva longitud de la matriz.
+ Es nulo si la matriz está vacía.
+ Error `WRONGTYPE` si el valor de la ruta no es una matriz.
+ Error `OUTOFBOUNDARIES` si un argumento de índice está fuera de los límites.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRTRIM k1 $[*] 0 1
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 2
   127.0.0.1:6379> JSON.GET k1
   "[[],[\"a\"],[\"a\",\"b\"],[\"a\",\"b\"]]"
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.ARRTRIM k1 .children 0 1
(integer) 2
127.0.0.1:6379> JSON.GET k1 .children
"[\"John\",\"Jack\"]"
```

# JSON.CLEAR
<a name="json-clear"></a>

Borra las matrices o un objeto de la ruta.

Sintaxis

```
JSON.CLEAR <key> [path]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona

**Devolución**
+ Entero, el número de contenedores borrados.
+ La eliminación de una matriz u objeto vacío representa 0 contenedores borrados.
**nota**  
Antes de la versión 6.2.6.R2 de Redis OSS, la eliminación de una matriz u objeto vacío correspondía a 1 contenedor borrado.
+ Al borrar un valor no contenedor, se devuelve 0.
+ Si la ruta no encuentra ningún valor de matriz u objeto, el comando devuelve 0.

**Ejemplos**

```
127.0.0.1:6379> JSON.SET k1 . '[[], [0], [0,1], [0,1,2], 1, true, null, "d"]'
OK
127.0.0.1:6379>  JSON.CLEAR k1  $[*]
(integer) 6
127.0.0.1:6379> JSON.CLEAR k1  $[*]
(integer) 0
127.0.0.1:6379> JSON.SET k2 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.CLEAR k2 .children
(integer) 1
127.0.0.1:6379> JSON.GET k2 .children
"[]"
```

# JSON.DEBUG
<a name="json-debug"></a>

Información del informe. Los subcomandos admitidos son:
+ MEMORY <clave> [ruta]: informa el uso de memoria en bytes de un valor JSON. La ruta se establece de forma predeterminada en la raíz si no se proporciona.
+ DEPTH <clave> [ruta]: informa de la profundidad de ruta máxima del documento JSON.
**nota**  
Este subcomando solo está disponible con la versión 7.2 o posterior de Valkey o con la versión 6.2.6.R2 o posterior del motor del Redis OSS.
+ FIELDS <clave> [ruta]: informa el número de campos de la ruta del documento especificada. La ruta se establece de forma predeterminada en la raíz si no se proporciona. Cada valor JSON que no es de contenedor cuenta como un campo. Los objetos y las matrices cuentan de forma recursiva un campo para cada uno de los valores JSON que contienen. Cada valor de contenedor, excepto el contenedor raíz, cuenta como un campo adicional.
+ AYUDA: imprime mensajes de ayuda del comando.

Sintaxis

```
JSON.DEBUG <subcommand & arguments>
```

Depende del subcomando:

MEMORIA
+ Si la ruta es de sintaxis mejorada:
  + devuelve una matriz de números enteros, que representan el tamaño de memoria (en bytes) del valor JSON en cada ruta.
  + devuelve una matriz vacía si la clave no existe.
+ Si la ruta es de sintaxis restringida:
  + devuelve un número entero, tamaño de memoria y el valor JSON en bytes.
  + devuelve nulo si la clave no existe.

DEPTH
+ Devuelve un entero que representa la profundidad de ruta máxima del documento JSON.
+ Devuelve nulo si la clave no existe.

FIELDS
+ Si la ruta es de sintaxis mejorada:
  + devuelve una matriz de números enteros, que representa el número de campos de valor JSON en cada ruta.
  + devuelve una matriz vacía si la clave no existe.
+ Si la ruta es de sintaxis restringida:
  + devuelve un número entero, el número de campos del valor JSON.
  + devuelve nulo si la clave no existe.

AYUDA: devuelve una serie de mensajes de ayuda.

**Ejemplos**

Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '[1, 2.3, "foo", true, null, {}, [], {"a":1, "b":2}, [1,2,3]]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY k1 $[*]
1) (integer) 16
2) (integer) 16
3) (integer) 19
4) (integer) 16
5) (integer) 16
6) (integer) 16
7) (integer) 16
8) (integer) 50
9) (integer) 64
127.0.0.1:6379> JSON.DEBUG FIELDS k1 $[*]
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 1
5) (integer) 1
6) (integer) 0
7) (integer) 0
8) (integer) 2
9) (integer) 3
```

Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY k1
(integer) 632
127.0.0.1:6379> JSON.DEBUG MEMORY k1 .phoneNumbers
(integer) 166

127.0.0.1:6379> JSON.DEBUG FIELDS k1
(integer) 19
127.0.0.1:6379> JSON.DEBUG FIELDS k1 .address
(integer) 4

127.0.0.1:6379> JSON.DEBUG HELP
1) JSON.DEBUG MEMORY <key> [path] - report memory size (bytes) of the JSON element. Path defaults to root if not provided.
2) JSON.DEBUG FIELDS <key> [path] - report number of fields in the JSON element. Path defaults to root if not provided.
3) JSON.DEBUG HELP - print help message.
```

# JSON.DEL
<a name="json-del"></a>

Borra los valores JSON de la ruta de acceso de una clave de documento. Si la ruta es la raíz, equivale a eliminar la clave de Valkey o Redis OSS.

Sintaxis

```
JSON.DEL <key> [path]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona

**Devolución**
+ Número de elementos eliminados.
+ 0 si la clave no existe.
+ 0 si la ruta JSON no es válida o no existe.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.DEL k1 $.d.*
(integer) 3
127.0.0.1:6379> JSOn.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.DEL k1 $.e[*]
(integer) 5
127.0.0.1:6379> JSOn.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[]}"
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.DEL k1 .d.*
(integer) 3
127.0.0.1:6379> JSON.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.DEL k1 .e[*]
(integer) 5
127.0.0.1:6379> JSON.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[]}"
```

# JSON.FORGET
<a name="json-forget"></a>

Un alias de [JSON.DEL](json-del.md)

# JSON.GET
<a name="json-get"></a>

Devuelve el formato JSON serializado en una o varias rutas.

Sintaxis

```
JSON.GET <key>
[INDENT indentation-string]
[NEWLINE newline-string]
[SPACE space-string]
[NOESCAPE]
[path ...]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ INDENT/NEWLINE/SPACE(opcional): controla el formato de la cadena JSON devuelta, es decir, «pretty print». El valor predeterminado de cada una es una cadena vacía. Se puede anular en cualquier combinación. Estos se pueden especificar en cualquier orden.
+ SIN ESCAPE: opcional, puede estar presente para la compatibilidad con versiones anteriores y no tiene ningún otro efecto.
+ ruta (opcional): cero o más rutas JSON, el valor predeterminado es la raíz si no se proporciona ninguna. Los argumentos de la ruta deben colocarse al final.

**Devolución**

Sintaxis de la ruta mejorada:

 Si se da una ruta:
+ Devuelve una cadena serializada de una matriz de valores.
+ Si no selecciona ningún valor, el comando devuelve una matriz vacía.

 Si se proporcionan varias rutas:
+ Devuelve un objeto JSON con cadenas, en el que cada ruta es una clave.
+ Si hay una sintaxis de ruta restringida y mejorada mixta, el resultado se ajusta a la sintaxis mejorada.
+ Si no existe una ruta, su valor correspondiente es una matriz vacía.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.GET k1 $.address.*
"[\"21 2nd Street\",\"New York\",\"NY\",\"10021-3100\"]"
127.0.0.1:6379> JSON.GET k1 indent "\t" space " " NEWLINE "\n" $.address.*
"[\n\t\"21 2nd Street\",\n\t\"New York\",\n\t\"NY\",\n\t\"10021-3100\"\n]"
127.0.0.1:6379> JSON.GET k1 $.firstName $.lastName $.age
"{\"$.firstName\":[\"John\"],\"$.lastName\":[\"Smith\"],\"$.age\":[27]}"            
127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}}'
OK
127.0.0.1:6379> json.get k2 $..*
"[{},{\"a\":1},{\"a\":1,\"b\":2},1,1,2]"
```

 Sintaxis de la ruta restringida:

```
 127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.GET k1 .address
"{\"street\":\"21 2nd Street\",\"city\":\"New York\",\"state\":\"NY\",\"zipcode\":\"10021-3100\"}"
127.0.0.1:6379> JSON.GET k1 indent "\t" space " " NEWLINE "\n" .address
"{\n\t\"street\": \"21 2nd Street\",\n\t\"city\": \"New York\",\n\t\"state\": \"NY\",\n\t\"zipcode\": \"10021-3100\"\n}"
127.0.0.1:6379> JSON.GET k1 .firstName .lastName .age
"{\".firstName\":\"John\",\".lastName\":\"Smith\",\".age\":27}"
```

# JSON.MGET
<a name="json-mget"></a>

Se serializa JSONs en la ruta a partir de varias claves de documentos. Devuelve un valor nulo para una clave o ruta JSON inexistente.

Sintaxis

```
JSON.MGET <key> [key ...] <path>
```
+ clave (obligatorio): una o más claves del tipo de documento.
+ ruta (obligatoria): ruta JSON

**Devolución**
+ Matriz de cadenas masivas. El tamaño de la matriz es igual al número de teclas del comando. Cada elemento de la matriz se rellena con (a) el comando JSON serializado tal como se encuentra en la ruta o (b) nulo si la clave no existe, la ruta no existe en el documento, o la ruta no es válida (error de sintaxis).
+ Si alguna de las claves especificadas existe y no es una clave JSON, el comando devuelve el error `WRONGTYPE`.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021"}}'
OK
127.0.0.1:6379> JSON.SET k2 . '{"address":{"street":"5 main Street","city":"Boston","state":"MA","zipcode":"02101"}}'
OK
127.0.0.1:6379> JSON.SET k3 . '{"address":{"street":"100 Park Ave","city":"Seattle","state":"WA","zipcode":"98102"}}'
OK
127.0.0.1:6379> JSON.MGET k1 k2 k3 $.address.city
1) "[\"New York\"]"
2) "[\"Boston\"]"
3) "[\"Seattle\"]"
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021"}}'
OK
127.0.0.1:6379> JSON.SET k2 . '{"address":{"street":"5 main Street","city":"Boston","state":"MA","zipcode":"02101"}}'
OK
127.0.0.1:6379> JSON.SET k3 . '{"address":{"street":"100 Park Ave","city":"Seattle","state":"WA","zipcode":"98102"}}'
OK

127.0.0.1:6379> JSON.MGET k1 k2 k3 .address.city
1) "\"New York\""
2) "\"Seattle\""
3) "\"Seattle\""
```

# JSON.NUMINCRBY
<a name="json-numincrby"></a>

Aumenta los valores numéricos de la ruta en un determinado número.

Sintaxis

```
JSON.NUMINCRBY <key> <path> <number>
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (obligatoria): ruta JSON
+ número (obligatorio): un número

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de cadenas masivas que representa el valor resultante en cada ruta.
+ Si un valor no es un número, su valor devuelto correspondiente es nulo.
+ El error `WRONGTYPE` si el número no se puede analizar.
+ El error `OVERFLOW` si el resultado está fuera del rango del doble IEEE de 64 bits.
+ `NONEXISTENT` si la clave del documento no existe.

Si la ruta es de sintaxis restringida:
+ Cadena masiva que representa el valor resultante.
+ Si se seleccionan varios valores, el comando devuelve el resultado del último valor actualizado.
+ El error `WRONGTYPE` si el valor de la ruta no es un número.
+ El error `WRONGTYPE` si el número no se puede analizar.
+ El error `OVERFLOW` si el resultado está fuera del rango del doble IEEE de 64 bits.
+ `NONEXISTENT` si la clave del documento no existe.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 $.d[*] 10
"[11,12,13]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[11,12,13]}"

127.0.0.1:6379> JSON.SET k1 $ '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 $.a[*] 1
"[]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.b[*] 1
"[2]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.c[*] 1
"[2,3]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.d[*] 1
"[2,3,4]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[2,3,4]}"

127.0.0.1:6379> JSON.SET k2 $ '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k2 $.a.* 1
"[]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.b.* 1
"[2]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.c.* 1
"[2,3]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.d.* 1
"[2,3,4]"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":2,\"b\":3,\"c\":4}}"

127.0.0.1:6379> JSON.SET k3 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k3 $.a.* 1
"[null]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.b.* 1
"[null,2]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.c.* 1
"[null,null]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.d.* 1
"[2,null,4]"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":2,\"b\":\"b\",\"c\":4}}"
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 .d[1] 10
"12"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[1,12,3]}"

127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 .a[*] 1
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMINCRBY k1 .b[*] 1
"2"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[1,2],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMINCRBY k1 .c[*] 1
"3"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMINCRBY k1 .d[*] 1
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[2,3,4]}"

127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k2 .a.* 1
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMINCRBY k2 .b.* 1
"2"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":1,\"b\":2},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMINCRBY k2 .c.* 1
"3"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMINCRBY k2 .d.* 1
"4"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":2,\"b\":3,\"c\":4}}"

127.0.0.1:6379> JSON.SET k3 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k3 .a.* 1
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMINCRBY k3 .b.* 1
"2"
127.0.0.1:6379> JSON.NUMINCRBY k3 .c.* 1
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMINCRBY k3 .d.* 1
"4"
```

# JSON.NUMMULTBY
<a name="json-nummultby"></a>

Multiplica los valores numéricos de la ruta por un determinado número.

Sintaxis

```
JSON.NUMMULTBY <key> <path> <number>
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (obligatoria): ruta JSON
+ número (obligatorio): un número

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de cadenas masivas que representa el valor resultante en cada ruta.
+ Si un valor no es un número, su valor devuelto correspondiente es nulo.
+ El error `WRONGTYPE` si el número no se puede analizar.
+ El error `OVERFLOW` si el resultado está fuera del rango del doble IEEE de 64 bits.
+ `NONEXISTENT` si la clave del documento no existe.

Si la ruta es de sintaxis restringida:
+ Cadena masiva que representa el valor resultante.
+ Si se seleccionan varios valores, el comando devuelve el resultado del último valor actualizado.
+ El error `WRONGTYPE` si el valor de la ruta no es un número.
+ El error `WRONGTYPE` si el número no se puede analizar.
+ El error `OVERFLOW` si el resultado está fuera del rango del doble IEEE de 64 bits.
+ `NONEXISTENT` si la clave del documento no existe.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 $.d[*] 2
"[2,4,6]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[2,4,6]}"

127.0.0.1:6379> JSON.SET k1 $ '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 $.a[*] 2
"[]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.b[*] 2
"[2]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.c[*] 2
"[2,4]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.d[*] 2
"[2,4,6]"

127.0.0.1:6379> JSON.SET k2 $ '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k2 $.a.* 2
"[]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.b.* 2
"[2]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.c.* 2
"[2,4]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.d.* 2
"[2,4,6]"

127.0.0.1:6379> JSON.SET k3 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k3 $.a.* 2
"[null]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.b.* 2
"[null,2]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.c.* 2
"[null,null]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.d.* 2
"[2,null,6]"
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 .d[1] 2
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[1,4,3]}"

127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 .a[*] 2
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMMULTBY k1 .b[*] 2
"2"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[1,2],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMMULTBY k1 .c[*] 2
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,4],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMMULTBY k1 .d[*] 2
"6"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,4],\"d\":[2,4,6]}"

127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k2 .a.* 2
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMMULTBY k2 .b.* 2
"2"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":1,\"b\":2},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k2 .c.* 2
"4"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":4},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k2 .d.* 2
"6"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":4},\"d\":{\"a\":2,\"b\":4,\"c\":6}}"

127.0.0.1:6379> JSON.SET k3 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k3 .a.* 2
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMMULTBY k3 .b.* 2
"2"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":1,\"b\":\"b\",\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k3 .c.* 2
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMMULTBY k3 .d.* 2
"6"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":2,\"b\":\"b\",\"c\":6}}"
```

# JSON.OBJLEN
<a name="json-objlen"></a>

Obtiene el número de claves en los valores del objeto en la ruta.

Sintaxis

```
JSON.OBJLEN <key> [path]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de números enteros, que representa la longitud del objeto en cada ruta.
+ Si un valor no es un objeto, su valor devuelto correspondiente es nulo.
+ Es nulo si la clave del documento no existe.

Si la ruta es de sintaxis restringida:
+ Entero, número de claves del objeto.
+ Si hay varios objetos seleccionados, el comando devuelve la longitud del primer objeto.
+ El error `WRONGTYPE` si el valor de la ruta no es un objeto.
+ Error `WRONGTYPE` si la ruta no existe.
+ Es nulo si la clave del documento no existe.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJLEN k1 $.a
1) (integer) 0
127.0.0.1:6379> JSON.OBJLEN k1 $.a.*
(empty array)
127.0.0.1:6379> JSON.OBJLEN k1 $.b
1) (integer) 1
127.0.0.1:6379> JSON.OBJLEN k1 $.b.*
1) (nil)
127.0.0.1:6379> JSON.OBJLEN k1 $.c
1) (integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 $.c.*
1) (nil)
2) (nil)
127.0.0.1:6379> JSON.OBJLEN k1 $.d
1) (integer) 3
127.0.0.1:6379> JSON.OBJLEN k1 $.d.*
1) (nil)
2) (nil)
3) (integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 $.*
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 3
5) (nil)
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJLEN k1 .a
(integer) 0
127.0.0.1:6379> JSON.OBJLEN k1 .a.*
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.OBJLEN k1 .b
(integer) 1
127.0.0.1:6379> JSON.OBJLEN k1 .b.*
(error) WRONGTYPE JSON element is not an object
127.0.0.1:6379> JSON.OBJLEN k1 .c
(integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 .c.*
(error) WRONGTYPE JSON element is not an object
127.0.0.1:6379> JSON.OBJLEN k1 .d
(integer) 3
127.0.0.1:6379> JSON.OBJLEN k1 .d.*
(integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 .*
(integer) 0
```

# JSON.OBJKEYS
<a name="json-objkeys"></a>

Obtiene los nombres de claves en los valores de objeto de la ruta.

Sintaxis

```
JSON.OBJKEYS <key> [path]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de matriz de cadenas masivas. Cada elemento es una matriz de claves de un objeto coincidente.
+ Si un valor no es un objeto, su valor devuelto correspondiente es un valor vacío.
+ Es nulo si la clave del documento no existe.

Si la ruta es de sintaxis restringida:
+ Matriz de cadenas a granel. Cada elemento es un nombre clave del objeto.
+ Si hay varios objetos seleccionados, el comando devuelve las claves del primer objeto.
+ El error `WRONGTYPE` si el valor de la ruta no es un objeto.
+ Error `WRONGTYPE` si la ruta no existe.
+ Es nulo si la clave del documento no existe.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJKEYS k1 $.*
1) (empty array)
2) 1) "a"
3) 1) "a"
   2) "b"
4) 1) "a"
   2) "b"
   3) "c"
5) (empty array)
127.0.0.1:6379> JSON.OBJKEYS k1 $.d
1) 1) "a"
   2) "b"
   3) "c"
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJKEYS k1 .*
1) "a"
127.0.0.1:6379> JSON.OBJKEYS k1 .d
1) "a"
2) "b"
3) "c"
```

# JSON.RESP
<a name="json-resp"></a>

Devuelve el valor JSON en la ruta especificada en el protocolo de serialización de Valkey o Redis OSS (RESP). Si el valor es contenedor, la respuesta es una matriz RESP o matriz anidada.
+ El valor nulo de JSON se asigna a la cadena masiva nula de RESP.
+ Los valores booleanos JSON se asignan a las cadenas simples de RESP respectivas.
+ Los números enteros se asignan a números enteros RESP.
+ Los números de coma flotante doble IEEE de 64 bits se asignan a cadenas masivas RESP.
+ Las cadenas JSON se asignan a cadenas masivas de RESP.
+ Las matrices JSON se representan como matrices RESP, donde el primer elemento es la cadena simple [, seguida de los elementos de la matriz.
+ Los objetos JSON se representan como matrices RESP, donde el primer elemento es la cadena simple \$1, seguida de los pares clave-valor, cada uno de los cuales es una cadena masiva RESP.

Sintaxis

```
JSON.RESP <key> [path]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de matrices. Cada elemento de la matriz representa la forma RESP del valor en una ruta.
+ Matriz vacía si la clave del documento no existe.

Si la ruta es de sintaxis restringida:
+ Matriz, que representa la forma RESP del valor en la ruta.
+ Es nulo si la clave del documento no existe.

**Ejemplos**

Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK

127.0.0.1:6379> JSON.RESP k1 $.address
1) 1) {
   2) 1) "street"
      2) "21 2nd Street"
   3) 1) "city"
      2) "New York"
   4) 1) "state"
      2) "NY"
   5) 1) "zipcode"
      2) "10021-3100"

127.0.0.1:6379> JSON.RESP k1 $.address.*
1) "21 2nd Street"
2) "New York"
3) "NY"
4) "10021-3100"

127.0.0.1:6379> JSON.RESP k1 $.phoneNumbers
1) 1) [
   2) 1) {
      2) 1) "type"
         2) "home"
      3) 1) "number"
         2) "555 555-1234"
   3) 1) {
      2) 1) "type"
         2) "office"
      3) 1) "number"
         2) "555 555-4567"

127.0.0.1:6379> JSON.RESP k1 $.phoneNumbers[*]
1) 1) {
   2) 1) "type"
      2) "home"
   3) 1) "number"
      2) "212 555-1234"
2) 1) {
   2) 1) "type"
      2) "office"
   3) 1) "number"
      2) "555 555-4567"
```

Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK

127.0.0.1:6379> JSON.RESP k1 .address
1) {
2) 1) "street"
   2) "21 2nd Street"
3) 1) "city"
   2) "New York"
4) 1) "state"
   2) "NY"
5) 1) "zipcode"
   2) "10021-3100"

127.0.0.1:6379> JSON.RESP k1
 1) {
 2) 1) "firstName"
    2) "John"
 3) 1) "lastName"
    2) "Smith"
 4) 1) "age"
    2) (integer) 27
 5) 1) "weight"
    2) "135.25"
 6) 1) "isAlive"
    2) true
 7) 1) "address"
    2) 1) {
       2) 1) "street"
          2) "21 2nd Street"
       3) 1) "city"
          2) "New York"
       4) 1) "state"
          2) "NY"
       5) 1) "zipcode"
          2) "10021-3100"
 8) 1) "phoneNumbers"
    2) 1) [
       2) 1) {
          2) 1) "type"
             2) "home"
          3) 1) "number"
             2) "212 555-1234"
       3) 1) {
          2) 1) "type"
             2) "office"
          3) 1) "number"
             2) "555 555-4567"
 9) 1) "children"
    2) 1) [
10) 1) "spouse"
    2) (nil)
```

# JSON.SET
<a name="json-set"></a>

Establece valores JSON en la ruta.

Si la ruta de acceso llama a un miembro de objeto:
+ Si el elemento principal no existe, el comando devolverá un error INEXISTENTE.
+ Si el elemento principal existe pero no es un objeto, el comando devolverá ERROR.
+ Si el elemento principal existe y es un objeto:
  +  Si el miembro no existe, se anexará un miembro nuevo al objeto principal si y solo si el objeto principal es el último objeto secundario de la ruta. De lo contrario, el comando devolverá un error INEXISTENTE.
  +  Si el miembro existe, su valor se reemplazará por el valor JSON.

Si la ruta requiere un índice de matriz:
+ Si el elemento principal no existe, el comando devolverá un error INEXISTENTE.
+ Si el elemento principal existe pero no es una matriz, el comando devolverá ERROR.
+ Si el elemento principal existe pero el índice está fuera de los límites, el comando devuelve un error OUTOFBOUNDARIES.
+ Si el elemento principal existe y el índice es válido, el elemento se reemplazará por el nuevo valor JSON.

Si la ruta llama a un objeto o matriz, el valor (objeto o matriz) se reemplazará por el nuevo valor JSON.

Sintaxis

```
JSON.SET <key> <path> <json> [NX | XX] 
```

[NX \$1 XX] Donde puede tener 0 o 1 de [NX \$1 XX] identificadores
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (obligatoria): una ruta JSON. Para una nueva clave, la ruta JSON debe ser la raíz “.”.
+ NX (opcional): si la ruta es la raíz, establezca el valor solo si la clave no existe; por ejemplo, insertar un nuevo documento. Si la ruta no es la raíz, establece el valor solo si la ruta no existe, es decir, inserta un valor en el documento.
+ XX (opcional): si la ruta es la raíz, establezca el valor solo si existe la clave; por ejemplo, reemplazar el documento existente. Si la ruta no es la raíz, establece el valor solo si la ruta existe, es decir, actualiza el valor existente.

**Devolución**
+ Cadena simple ‘OK’ en caso de éxito.
+ Es nulo si no se cumple la condición NX o XX.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.SET k1 $.a.* '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"a\":{\"a\":0,\"b\":0,\"c\":0}}"

127.0.0.1:6379> JSON.SET k2 . '{"a": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.SET k2 $.a[*] '0'
OK
127.0.0.1:6379> JSON.GET k2
"{\"a\":[0,0,0,0,0]}"
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"c":{"a":1, "b":2}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.SET k1 .c.a '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"c\":{\"a\":0,\"b\":2},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.SET k1 .e[-1] '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"c\":{\"a\":0,\"b\":2},\"e\":[1,2,3,4,0]}"
127.0.0.1:6379> JSON.SET k1 .e[5] '0'
(error) OUTOFBOUNDARIES Array index is out of bounds
```

# JSON.STRAPPEND
<a name="json-strappend"></a>

Adjunta una cadena a las cadenas JSON de la ruta.

Sintaxis

```
JSON.STRAPPEND <key> [path] <json_string>
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona
+ json\$1string (obligatorio): representación JSON de una cadena. Tenga en cuenta que se debe citar una cadena JSON, por ejemplo, “foo”.

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de números enteros, que representa la nueva longitud de la cadena en cada ruta.
+ Si un valor en la ruta no es una cadena, su valor devuelto correspondiente es nulo.
+ Error `SYNTAXERR ` si el argumento json de entrada no es una cadena JSON válida.
+ Error `NONEXISTENT ` si la ruta no existe.

Si la ruta es de sintaxis restringida:
+ Entero, la nueva longitud de la cadena.
+ Si se seleccionan varios valores de cadena, el comando devuelve la nueva longitud de la última cadena actualizada.
+ Error `WRONGTYPE` si el valor de la ruta no es una cadena.
+ Error `WRONGTYPE` si el argumento json de entrada no es una cadena JSON válida.
+ Error `NONEXISTENT` si la ruta no existe.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRAPPEND k1 $.a.a '"a"'
1) (integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 $.a.* '"a"'
1) (integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 $.b.* '"a"'
1) (integer) 2
2) (nil)
127.0.0.1:6379> JSON.STRAPPEND k1 $.c.* '"a"'
1) (integer) 2
2) (integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 $.c.b '"a"'
1) (integer) 4
127.0.0.1:6379> JSON.STRAPPEND k1 $.d.* '"a"'
1) (nil)
2) (integer) 2
3) (nil)
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRAPPEND k1 .a.a '"a"'
(integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 .a.* '"a"'
(integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 .b.* '"a"'
(integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 .c.* '"a"'
(integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 .c.b '"a"'
(integer) 4
127.0.0.1:6379> JSON.STRAPPEND k1 .d.* '"a"'
(integer) 2
```

# JSON.STRLEN
<a name="json-strlen"></a>

Obtiene las longitudes de los valores de cadena JSON en la ruta.

Sintaxis

```
JSON.STRLEN <key> [path] 
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de números enteros, que representa la longitud de la cadena en cada ruta.
+ Si un valor no es una cadena, su valor devuelto correspondiente es nulo.
+ Es nulo si la clave del documento no existe.

Si la ruta es de sintaxis restringida:
+ Entero, la longitud de la cadena.
+ Si se seleccionan varios valores de cadena, el comando devuelve la longitud de la primera cadena.
+ Error `WRONGTYPE` si el valor de la ruta no es una cadena.
+ Error `NONEXISTENT` si la ruta no existe.
+ Es nulo si la clave del documento no existe.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRLEN k1 $.a.a
1) (integer) 1
127.0.0.1:6379> JSON.STRLEN k1 $.a.*
1) (integer) 1
127.0.0.1:6379> JSON.STRLEN k1 $.c.*
1) (integer) 1
2) (integer) 2
127.0.0.1:6379> JSON.STRLEN k1 $.c.b
1) (integer) 2
127.0.0.1:6379> JSON.STRLEN k1 $.d.*
1) (nil)
2) (integer) 1
3) (nil)
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRLEN k1 .a.a
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .a.*
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .c.*
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .c.b
(integer) 2
127.0.0.1:6379> JSON.STRLEN k1 .d.*
(integer) 1
```

# JSON.TOGGLE
<a name="json-toggle"></a>

Alterna los valores booleanos entre verdadero y falso en la ruta.

Sintaxis

```
JSON.TOGGLE <key> [path] 
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de números enteros (0 - falso, 1 - verdadero) que representa el valor booleano resultante en cada ruta.
+ Si un valor no es un valor booleano, su valor devuelto correspondiente es nulo.
+ `NONEXISTENT` si la clave del documento no existe.

Si la ruta es de sintaxis restringida:
+ Cadena (“verdadero”/”falso”) que representa el valor booleano resultante.
+ `NONEXISTENT` si la clave del documento no existe.
+ Error `WRONGTYPE` si el valor de la ruta no es un valor booleano.

**Ejemplos**

 Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":true, "b":false, "c":1, "d":null, "e":"foo", "f":[], "g":{}}'
OK
127.0.0.1:6379> JSON.TOGGLE k1 $.*
1) (integer) 0
2) (integer) 1
3) (nil)
4) (nil)
5) (nil)
6) (nil)
7) (nil)
127.0.0.1:6379> JSON.TOGGLE k1 $.*
1) (integer) 1
2) (integer) 0
3) (nil)
4) (nil)
5) (nil)
6) (nil)
7) (nil)
```

 Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . true
OK
127.0.0.1:6379> JSON.TOGGLE k1
"false"
127.0.0.1:6379> JSON.TOGGLE k1
"true"

127.0.0.1:6379> JSON.SET k2 . '{"isAvailable": false}'
OK
127.0.0.1:6379> JSON.TOGGLE k2 .isAvailable
"true"
127.0.0.1:6379> JSON.TOGGLE k2 .isAvailable
"false"
```

# JSON.TYPE
<a name="json-type"></a>

Informa el tipo de valores en la ruta dada.

Sintaxis

```
JSON.TYPE <key> [path]
```
+ clave (obligatorio): clave del tipo de documento JSON
+ ruta (opcional): una ruta JSON. Toma el valor predeterminado raíz si no se proporciona

**Devolución**

Si la ruta es de sintaxis mejorada:
+ Matriz de cadenas, que representa el tipo de valor en cada ruta. El tipo es uno de \$1"nulo", "booleano", "cadena", "número", "entero", "objeto" y "matriz"\$1.
+ Si no existe una ruta, su valor de retorno correspondiente es nulo.
+ Matriz vacía si la clave del documento no existe.

Si la ruta es de sintaxis restringida:
+ Cadena, tipo del valor
+ Es nulo si la clave del documento no existe.
+ Es nulo si la ruta JSON no es válida o no existe.

**Ejemplos**

Sintaxis de la ruta mejorada:

```
127.0.0.1:6379> JSON.SET k1 . '[1, 2.3, "foo", true, null, {}, []]'
OK
127.0.0.1:6379> JSON.TYPE k1 $[*]
1) integer
2) number
3) string
4) boolean
5) null
6) object
7) array
```

Sintaxis de la ruta restringida:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.TYPE k1
object
127.0.0.1:6379> JSON.TYPE k1 .children
array
127.0.0.1:6379> JSON.TYPE k1 .firstName
string
127.0.0.1:6379> JSON.TYPE k1 .age
integer
127.0.0.1:6379> JSON.TYPE k1 .weight
number
127.0.0.1:6379> JSON.TYPE k1 .isAlive
boolean
127.0.0.1:6379> JSON.TYPE k1 .spouse
null
```