JSONpanoramica dei tipi di dati - Amazon ElastiCache

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 e ECMA-404JSON. UTF-8 È supportato il formato Unicode nel testo. JSON

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.

ACL
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, che abbiamo modificato aggiungendo campi aggiuntivi.

{ "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 citati in questa documentazione sono soggetti alla Creative Commons License.

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 diint64, 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.