Espressioni di aggiornamento DynamoDB: SET, REMOVE, ADD, DELETE (con esempi)
Un'espressione di aggiornamento indica a UpdateItem come mutare un singolo elemento: which
per scrivere, incrementare, eliminare o piegare in un set. Non c'è più riga
UPDATE … SET … WHERE: dai un nome a un singolo elemento con la sua chiave completa e descrivilo
cambiare con parole chiave a quattro clausole.
Come funzionano le espressioni di aggiornamento DynamoDB?
Un'espressione di aggiornamento DynamoDB indica a UpdateItem come modificare un elemento utilizzando quattro clausole. SET scrive o sovrascrive un . ADD incrementa atomicamente un numero o unioni in un set. REMOVE elimina un attributo o un elemento dell'elenco. DELETE rimuove membri specifici da un set. Una chiamata può trasportarli tutti e quattro contemporaneamente.
SETscrive o sovrascrive un attributo: scalari, documenti e file idiomi funzioneif_not_existselist_append.ADDesegue un incremento di numero atomico o un'unione di insieme, in un viaggio di andata e ritorno, senza prima lettura.REMOVEelimina completamente un attributo (o un singolo elemento dell'elenco per indice).DELETErimuove membri specifici da un set — e solo da un set.
Venendo dall'SQL, la trappola è raggiungere l'SET per tutto. ADD e
DELETE esiste perché leggere-modificare-scrivere su un contatore o su un set è una gara che farai
perdere in concorrenza.
Scegli la clausola in base a ciò che stai modificando
Una chiamata UpdateItem può trasportare tutte e quattro le clausole contemporaneamente, in qualsiasi ordine. Ciascuno
La parola chiave appare al massimo una volta ed esegue un elenco di azioni separate da virgole.
| Clausola | Funziona su | Usalo per |
|---|---|---|
SET | Qualsiasi attributo | Write/overwrite un valore o un campo documento |
ADD | Solo numero o set | Incremento atomico o unione in un insieme |
REMOVE | Qualsiasi attributo o elemento della lista | Elimina un attributo; rilasciare un indice dell'elenco |
DELETE | Solo imposta | Rimuovere membri specifici da un set |
ADD su una stringa e DELETE su uno scalare sono errori di convalida, non operazioni non operative —
DynamoDB rifiuta l'intera chiamata. Secondo il
Riferimento espressione aggiornamento AWS,
ADD è limitato a numeri e insiemi e DELETE a insiemi.
L'esempio pratico: un carrello della spesa
Un articolo per carrello, codificato da CartPK = "CART#c-9f21" e CartSK = "SUMMARY".
Tiene traccia di un OrderTotal in esecuzione, di un elenco LineItems, di un set di stringhe PromoCodes,
e un ItemCount.
SET: scrive gli scalari e i documenti
SET sovrascrive qualunque cosa fosse lì. Aggiungi un elemento pubblicitario all'elenco e aumenta il file
totale nella stessa chiamata:
SET OrderTotal = :total,
LineItems = list_append(LineItems, :newItem),
UpdatedAt = :now
list_append(LineItems, :newItem)si aggiunge alla coda; ribaltare gli argomenti -list_append(:newItem, LineItems)`: da anteporre. L'ordine degli argomenti è il
ordine di concatenazione, niente di più.
C'è un fucile in quella prima chiamata: se il carrello è nuovo di zecca, LineItems
non esiste ancora e list_append su un attributo mancante fallisce. Custodiscilo con
if_not_exists:
SET LineItems = list_append(if_not_exists(LineItems, :empty), :newItem)
if_not_exists(LineItems, :empty)restituisce l'elenco corrente se presente, altrimenti il fallback:empty(un elenco vuoto[]`). Ciò rende la prima aggiunta e tutte le successive
aggiungi usa la stessa espressione: una vera ragione per cui esistono questi idiomi.
ADD: incrementa il conteggio, atomicamente
Per eseguire il bumping di ItemCount, non leggerlo, aggiungerne uno nel codice e SET ripristinarlo.
Questa è una corsa all'aggiornamento persa: due aggiunte simultanee leggono entrambi 3, entrambi scrivono 4 e
ne hai lasciato cadere uno. ADD esegue l'aritmetica lato server:
ADD ItemCount :one
Con :one = 1, questo è un contatore atomico. Le chiamate simultanee vengono serializzate sul file
oggetto, quindi due aggiunte atterrano come +2. Passa un numero negativo per diminuire. Se
ItemCount è assente, ADD lo tratta prima come 0, quindi non è mai necessario eseguire il seeding
il contatore.
Su richiesta in us-east-1, ogni ADD fattura 1 WCU per KB dell'articolo dopo
la scrittura (arrotondata per eccesso). Un riepilogo del carrello da 1 KB con i costi di un ADD ItemCount :one
1 WCU: la stessa riga con un SET di lettura-modifica-scrittura costerebbe la stessa WCU
ma perdere in concorrenza. Dimensiona l'articolo in
calcolatore delle dimensioni dell'articolo.
Puoi creare questa espressione esatta: nomi, valori digitati e marshalling
richiesta - nel
Costruttore di espressioni DynamoDB senza
eseguire l'escape manuale di un singolo segnaposto #name o :value.
Modifica il preset di seguito - un SET più un ADD atomico - e guarda il
Ricostruisci UpdateExpression man mano che procedi:
RIMUOVI: rilascia un attributo o un elemento pubblicitario
REMOVE è il modo in cui elimini completamente un attributo (non è possibile "impostarlo su null" -
che scrive semplicemente un tipo NULL). Cancella uno sconto applicato e rilascia il terzo
elemento pubblicitario in una chiamata:
REMOVE AppliedDiscount, LineItems[2]
LineItems[2]rimuove l'elemento all'indice 2 e **sposta tutto ciò che segue down**: l'indice 3 diventa 2 e così via. Se haiREMOVEdue indici in uno espressione, entrambi vengono valutati rispetto all'elenco **originale**, rimuovendo quindi[2]e[3]` insieme rilasciano il terzo e il quarto elemento come previsto.
DELETE: rimuove i membri dell'insieme
PromoCodes è un set di stringhe, quindi un cliente che inserisce un codice utilizza DELETE, non
REMOVE. REMOVE PromoCodes distruggerebbe l'intero set; DELETE sottrae il
membri nominati:
DELETE PromoCodes :pulled
Con :pulled = l'insieme {"SAVE10"}, va solo quel membro. Due regole mordono
qui: un set non può mai essere vuoto, quindi l'eliminazione dell'ultimo membro rimuove il file
Attributo PromoCodes a titolo definitivo; e il valore deve essere un tipo impostato corrispondente a
attributo: una stringa semplice è un errore di tipo.
Mettilo insieme
Un aggiornamento "aggiungi articolo, applica una promozione, aumenta il conteggio" è una chiamata su tre clausole:
SET LineItems = list_append(if_not_exists(LineItems, :empty), :newItem),
OrderTotal = OrderTotal + :price
ADD ItemCount :one
DELETE PromoCodes :expiredCode
Nota OrderTotal = OrderTotal + :price: l'aritmetica all'interno di SET funziona su
valore esistente. È altrettanto atomico e sicuro per la gara come ADD: valuta DynamoDB
Lato server OrderTotal + :price rispetto al valore corrente, quindi chiamate simultanee
serializzare sull'articolo invece di eseguire il andata e ritorno attraverso il codice.
Insidie da evitare
SETinserisce un contatore letto per primo. UsaADD: lettura-modifica-scrittura perde aggiornamenti in simultanea. Questo è il bug cart/inventory più comune.list_appendin un elenco mancante. Avvolgi il target inif_not_existso nel la prima scrittura fallisce.- Confusione tra
REMOVEeDELETE.REMOVEelimina l'attributo;DELETEsottrae membri da un insieme. Mescolarli cancella più di quanto volevi. - Dimenticare
UpdateItemè un upsert. Se la chiave non esiste, crea l'oggetto. Usa unConditionExpression(attribute_exists(CartPK)) quando significa "solo aggiornamento".
Per modellare le chiavi contro cui si scontrano queste espressioni, vedere design a tabella singola; per decidere come leggere il carrello indietro, vedere query vs scan.
Costruisci e copia uno qualsiasi di questi nel file costruttore di espressioni, quindi prova DynoTable per confrontarli con i tuoi tavoli e guarda l'articolo cambiare dal vivo.