Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
JSONpanoramica dei tipi di dati
ElastiCache supporta una serie di OSS comandi Valkey e Redis per lavorare con il tipo di JSON dati. Di seguito è riportata una panoramica del tipo di JSON dati e un elenco dettagliato dei comandi supportati.
Terminology
Termine | Descrizione |
---|---|
JSONdocumento |
Si riferisce al valore di una JSON chiave. |
JSONvalore |
Si riferisce a un sottoinsieme di un JSON documento, inclusa la radice che rappresenta l'intero documento. Un valore può essere un container o una voce vuota in un container. |
JSONelemento |
Equivalente al JSON valore. |
JSONStandard supportato
JSONil formato è conforme agli standard di interscambio RFCdati 7159
Elemento radice
L'elemento radice può essere di qualsiasi tipo di JSON dati. Si noti che nella versione precedente del RFC 4627, solo gli oggetti o gli array erano consentiti come valori radice. Dall'aggiornamento alla versione RFC 7159, la radice di un JSON documento può essere di qualsiasi tipo JSON di dati.
Limite delle dimensioni del documento
JSONi documenti vengono archiviati internamente in un formato ottimizzato per un accesso e una modifica rapidi. Questo formato generalmente comporta un consumo di memoria lievemente superiore alla rappresentazione serializzata equivalente dello stesso documento.
Il consumo di memoria da parte di un singolo JSON documento è limitato a 64 MB, che è la dimensione della struttura dei dati in memoria, non della JSON stringa. È possibile controllare la quantità di memoria consumata da un JSON documento utilizzando il JSON.DEBUG
MEMORY
comando.
JSON ACLs
Analogamente alle categorie esistenti per tipo di dati (@string, @hash, ecc.), viene aggiunta una nuova categoria @json per semplificare la gestione dell'accesso a comandi e dati. JSON Nessun altro OSS comando Valkey o Redis esistente appartiene alla categoria @json. Tutti i JSON comandi applicano eventuali restrizioni e autorizzazioni relative allo spazio dei tasti o ai comandi.
Esistono cinque OSS ACL categorie Valkey e Redis esistenti che vengono aggiornate per includere i nuovi JSON comandi: @read, @write, @fast, @slow e @admin. La tabella seguente indica la mappatura dei JSON comandi alle categorie appropriate.
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 |
Limite di profondità di nidificazione
Quando un JSON oggetto o un array ha un elemento che è a sua volta un altro JSON oggetto o array, si dice che quell'oggetto o array interno «nidifica» all'interno dell'oggetto o dell'array esterno. Il limite massimo di profondità di nidificazione è 128. Qualunque tentativo di creare un documento che contenga una profondità di nidificazione maggiore di 128 verrà rifiutato con un errore.
Sintassi dei comandi
La maggior parte dei comandi richiede un nome chiave come primo argomento. Alcuni comandi hanno anche un argomento path. L'argomento path per impostazione predefinita è la radice se è facoltativo e non viene fornito.
Notazione:
Gli argomenti richiesti sono racchiusi tra parentesi angolari. Esempio: <key>
Gli argomenti facoltativi sono racchiusi tra parentesi quadre. Esempio: [path]
Argomenti facoltativi supplementari sono indicati da un'ellissi ("…"). Esempio: [json...]
Sintassi del percorso
Redis JSON supporta due tipi di sintassi dei percorsi:
Sintassi avanzata: segue la JSONPath sintassi descritta da Goessner
, come illustrato nella tabella seguente. Abbiamo riordinato e modificato le descrizioni nella tabella per maggiore chiarezza. Sintassi limitata: ha limitate capacità di interrogazione.
Nota
I risultati di alcuni comandi sono sensibili al tipo di sintassi del percorso utilizzata.
Se un percorso di interrogazione inizia con '$', utilizza la sintassi avanzata. In caso contrario, viene utilizzata la sintassi limitata.
Sintassi avanzata
Simbolo/espressione | Descrizione |
---|---|
$ |
Lelemento radice. |
. o [] |
Operatore figlio. |
.. |
Discesa ricorsiva. |
* |
Carattere jolly. Tutti gli elementi di un oggetto o un array. |
[] |
Operatore pedice di un array. L'indice è basato su 0. |
[,] |
Operatore di unione. |
[start:end:step] |
Operatore di sezionamento di un array. |
?() |
Applica un'espressione filtro (script) all'array o all'oggetto corrente. |
() |
Espressione filtro. |
@ |
Utilizzato in espressioni filtro che fanno riferimento al nodo corrente in elaborazione. |
== |
Uguale a, utilizzato in espressioni filtro. |
!= |
Diverso da, utilizzato in espressioni filtro. |
> |
Maggiore di, utilizzato in espressioni filtro. |
>= |
Maggiore o uguale a, utilizzato in espressioni filtro. |
< |
Minore di, utilizzato in espressioni filtro. |
<= |
Mainore o uguale a, utilizzato in espressioni filtro. |
&& |
LogicoAND, utilizzato per combinare più espressioni di filtro. |
|| |
OR logico, utilizzato per combinare più espressioni filtro. |
Examples (Esempi)
I seguenti esempi sono basati sui XML dati di esempio di 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 } } }
Path | Descrizione |
---|---|
$.store.book[*].author |
Gli autori di tutti i libri del negozio. |
$..author |
tutti gli autori. |
$.store.* |
Tutti i membri del negozio. |
$["store"].* |
Tutti i membri del negozio. |
$.store..price |
Il prezzo di ogni cosa nel negozio. |
$..* |
Tutti i membri ricorsivi della struttura. JSON |
$..book[*] |
Tutti i libri. |
$..book[0] |
Il primo libro. |
$..book[-1] |
L'ultimo libro. |
$..book[0:2] |
I primi due libri. |
$..book[0,1] |
I primi due libri. |
$..book[0:4] |
Libri dall'indice 0 al 3 (l'indice finale escluso). |
$..book[0:4:2] |
Libri nell’indice 0, 2. |
$..book[?(@.isbn)] |
Tutti i libri con un ISBN numero. |
$..book[?(@.price<10)] |
Tutti i libri che costano meno di 10 euro. |
'$..book[?(@.price < 10)]' |
Tutti i libri che costano meno di 10 euro. (Il percorso deve essere tra virgolette se contiene spazi vuoti.) |
'$..book[?(@["price"] < 10)]' |
Tutti i libri che costano meno di 10 euro. |
'$..book[?(@.["price"] < 10)]' |
Tutti i libri che costano meno di 10 euro. |
$..book[?(@.price>=10&&@.price<=100)] |
Tutti i libri nella fascia di prezzo da 10 a 100 euro, inclusi. |
'$..book[?(@.price>=10 && @.price<=100)]' |
Tutti i libri nella fascia di prezzo da 10 a 100 euro, inclusi. (Il percorso deve essere tra virgolette se contiene spazi vuoti.) |
$..book[?(@.sold==true||@.in-stock==false)] |
Tutti i libri venduti o esauriti. |
'$..book[?(@.sold == true || @.in-stock == false)]' |
Tutti i libri venduti o esauriti. (Il percorso deve essere tra virgolette se contiene spazi vuoti.) |
'$.store.book[?(@.["category"] == "fiction")]' |
Tutti i libri della categoria fiction. |
'$.store.book[?(@.["category"] != "fiction")]' |
Tutti i libri appartenenti a categorie nonfiction. |
Altri esempi di espressioni 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]"
Sintassi limitata
Simbolo/espressione | Descrizione |
---|---|
. o [] |
Operatore figlio. |
[] |
Operatore pedice di un array. L'indice è basato su 0. |
Examples (Esempi)
Path | Descrizione |
---|---|
.store.book[0].author |
L'autore del primo libro. |
.store.book[-1].author |
L'autore dell’ultimo libro. |
.address.city |
Nome della città. |
["store"]["book"][0]["title"] |
Il titolo del primo libro. |
["store"]["book"][-1]["title"] |
Il titolo dell’ultimo libro. |
Nota
Tutti i contenuti di Goessner
Prefissi di errori comuni
Ogni messaggio di errore ha un prefisso. Di seguito è riportato un elenco di prefissi di errori comuni..
Prefix | Descrizione |
---|---|
ERR |
Un errore generale. |
LIMIT |
Un errore che si verifica quando vengono superati i limiti delle dimensioni. Ad esempio, il limite delle dimensioni del documento o il limite di profondità di nidificazione è stato superato. |
NONEXISTENT |
Una chiave o percorso non esiste. |
OUTOFBOUNDARIES |
Un indice array esterno ai limiti. |
SYNTAXERR |
Errore di sintassi. |
WRONGTYPE |
Tipo di valore errato. |
JSON-metriche correlate
Vengono fornite le seguenti metriche JSON informative:
Info | Descrizione |
---|---|
json_total_memory_bytes |
Memoria totale allocata agli oggetti. JSON |
json_num_documents |
Numero totale di documenti in Valkey o Redis. OSS |
Per interrogare le metriche principali, esegui il seguente comando:
info json_core_metrics
Come ElastiCache interagisce con Valkey e Redis OSS JSON
La sezione seguente descrive come ElastiCache con Valkey e Redis OSS interagisce con il tipo di dati. JSON
Precedenza degli operatori
Durante la valutazione delle espressioni condizionali per il filtro, && hanno la precedenza, quindi vengono valutati ||, come nella maggior parte dei linguaggi. Operazioni tra parentesi vengono eseguite per prime.
Comportamento del limite massimo di nidificazione dei percorsi
Il limite massimo di annidamento dei percorsi in ElastiCache (RedisOSS) è 128. Per cui, un valore come $.a.b.c.d...
può raggiungere solo 128 livelli.
Gestione dei valori numerici
JSONnon ha tipi di dati separati per numeri interi e numeri in virgola mobile. Sono tutti definiti “numeri”.
Rappresentazioni numeriche:
Quando un JSON numero viene ricevuto in input, viene convertito in una delle due rappresentazioni binarie interne: un intero con segno a 64 bit o una virgola mobile a IEEE doppia precisione a 64 bit. La stringa originaria e tutta la formattazione non vengono mantenute. Pertanto, quando un numero viene emesso come parte di una JSON risposta, viene convertito dalla rappresentazione binaria interna in una stringa stampabile che utilizza regole di formattazione generiche. Queste regole potrebbero determinare la generazione di una stringa diversa da quella ricevuta.
Comandi aritmetici NUMINCRBY
e NUMMULTBY
:
Se entrambi i numeri sono numeri interi e il risultato non rientra nell'intervallo di
int64
, diventa automaticamente un numero in virgola mobile a IEEE doppia precisione a 64 bit.Se almeno uno dei numeri è a virgola mobile, il risultato è un numero in virgola mobile a IEEE doppia precisione a 64 bit.
Se il risultato supera l'intervallo del IEEE doppio a 64 bit, il comando restituisce un errore.
OVERFLOW
Per un elenco dei comandi disponibili, consulta Comandi Valkey e Redis OSS supportati.
Filtraggio array diretto
ElastiCache con Valkey o Redis OSS filtra direttamente gli oggetti dell'array.
Per dati come [0,1,2,3,4,5,6]
e una query di percorso come$[?(@<4)]
, o dati simili {"my_key":[0,1,2,3,4,5,6]}
e una query di percorso come$.my_key[?(@<4)]
, ElastiCache con Valkey o Redis OSS restituirebbe [1,2,3] in entrambe le circostanze.
Comportamento di indicizzazione array
ElastiCache con Valkey o Redis OSS consente indici positivi e negativi per gli array. Per un array di lunghezza cinque, 0 interroga il primo elemento, 1 il secondo e così via. I numeri negativi iniziano alla fine dell'array, per cui -1 interroga il quinto elemento, -2 il quarto e così via.
Per garantire un comportamento prevedibile per i clienti, ElastiCache con Valkey o Redis OSS non arrotonda gli indici degli array verso il basso o verso l'alto, quindi se si dispone di un array con una lunghezza di 5, chiamare l'indice 5 o superiore, oppure -6 o inferiore, non produrrebbe alcun risultato.
Valutazione della sintassi rigida
MemoryDB non consente JSON percorsi con sintassi non valida, anche se un sottoinsieme del percorso contiene un percorso valido. Ciò permantenere un comportamento corretto per i nostri clienti.