Intermedio5 min di lettura

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.

  • SET scrive o sovrascrive un attributo: scalari, documenti e file idiomi funzione if_not_exists e list_append.
  • ADD esegue un incremento di numero atomico o un'unione di insieme, in un viaggio di andata e ritorno, senza prima lettura.
  • REMOVE elimina completamente un attributo (o un singolo elemento dell'elenco per indice).
  • DELETE rimuove 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.

ClausolaFunziona suUsalo per
SETQualsiasi attributoWrite/overwrite un valore o un campo documento
ADDSolo numero o setIncremento atomico o unione in un insieme
REMOVEQualsiasi attributo o elemento della listaElimina un attributo; rilasciare un indice dell'elenco
DELETESolo impostaRimuovere 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:

Costruisci la tua richiesta
Codice generato
new UpdateItemCommand({
  "TableName": "AuditLog",
  "Key": {
    "pk": {
      "S": "TENANT#acme"
    },
    "sk": {
      "S": "CONFIG"
    }
  },
  "UpdateExpression": "SET #upd0 = :updValue0 ADD #upd1 :updValue1",
  "ExpressionAttributeNames": {
    "#upd0": "plan",
    "#upd1": "seats"
  },
  "ExpressionAttributeValues": {
    ":updValue0": {
      "S": "pro"
    },
    ":updValue1": {
      "N": "5"
    }
  }
})

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

  • SET inserisce un contatore letto per primo. Usa ADD: lettura-modifica-scrittura perde aggiornamenti in simultanea. Questo è il bug cart/inventory più comune.
  • list_append in un elenco mancante. Avvolgi il target in if_not_exists o nel la prima scrittura fallisce.
  • Confusione tra REMOVE e DELETE. REMOVE elimina l'attributo; DELETE sottrae membri da un insieme. Mescolarli cancella più di quanto volevi.
  • Dimenticare UpdateItem è un upsert. Se la chiave non esiste, crea l'oggetto. Usa un ConditionExpression (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.

Aggiornato