Intermedio5 min di lettura

DynamoDB ReturnValues: ottieni il vecchio o il nuovo Item

Per impostazione predefinita, una scrittura DynamoDB non restituisce altro che successo. Ma spesso hai bisogno dei dati intorno alla scrittura: il valore prima di modificarlo o il nuovo valore dopo. Il la soluzione ingenua è un secondo GetItem, che è un viaggio di andata e ritorno extra e una gara: qualcuno altrimenti puoi scrivere in mezzo. DynamoDB evita entrambi con il parametro ReturnValues, che restituisce atomicamente l'elemento vecchio o nuovo come parte della scrittura stessa.

Cosa fa ReturnValues in DynamoDB?

ReturnValues dice a una scrittura DynamoDB di restituire l'oggetto come parte della stessa chiamata, quindi salti un secondo GetItem e la corsa che crea. PutItem e DeleteItem accettano NONE o ALL_OLD; UpdateItem accetta tutti e cinque (NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW), restituendo atomicamente valori vecchi o nuovi.

  • ReturnValues restituisce l'elemento come parte della scrittura: nessuna seconda lettura, nessuna gara.
  • NONE (predefinito) — non restituisce nulla.
  • ALL_OLD — l'intero articolo com'era prima della scrittura.
  • UPDATED_OLD: solo gli attributi modificati dall'aggiornamento, valori prima.
  • ALL_NEW — l'intero elemento dopo la scrittura.
  • UPDATED_NEW: solo gli attributi modificati, valori dopo.
  • PutItem/DeleteItem accetta solo NONE o ALL_OLD; UpdateItem accetta tutti cinque.

Il problema: ti serve il valore che hai appena sovrascritto

Supponiamo che gestisci un desk di supporto e che un agente modifichi lo stato di un ticket da open a pending. Il tuo registro di controllo deve registrare qual era lo stato prima della modifica. Senza ReturnValues avresti:

  1. GetItem per leggere lo stato corrente,
  2. UpdateItem per impostare quello nuovo.

Tra i passaggi 1 e 2 un altro agente potrebbe modificare lo stato: ora i record del registro di controllo un valore "prima" obsoleto. Peggio ancora, sono due chiamate per un'operazione logica. ReturnValues lo comprime in un singolo UpdateItem atomico che restituisce il vecchio stato così com'era in realtà era al momento della scrittura.

Le cinque opzioni e quando utilizzarle

UpdateItem supporta il set completo; la scelta è quale fetta dell'oggetto e quale lato della scrittura ti serve:

ReturnValuesResiUtilizzare quando
NONEnientenon è necessario che l'elemento venga restituito (impostazione predefinita)
ALL_OLDintero articolo, pre-scrivereauditing / "cosa ho appena sostituito?"
UPDATED_OLDattributi modificati, pre-scriviti interessano solo i campi che hai toccato
ALL_NEWintero articolo, post-scriviè necessario che l'elemento nuovo e completo venga restituito a un chiamante
UPDATED_NEWattributi modificati, post-scritturarileggendo un contatore/value hai appena incrementato

UPDATED_NEW è l'eroe di tutti i giorni: incrementa un contatore con un aggiorna espressione e rileggi il nuovo totale la stessa chiamata, nessuna gara. Per l'audit del ticket di supporto, ALL_OLD (o UPDATED_OLD se registri solo il campo stato) cattura atomicamente lo stato precedente alla modifica.

Nota l'asimmetria: PutItem e DeleteItem supportano solo NONE e ALL_OLD — non esiste un valore "nuovo" da restituire per un'eliminazione e il nuovo valore di un put è proprio quello che tu inviato. Solo UpdateItem, che muta sul posto, li offre tutti e cinque. Documenti AWS la matrice esatta.

Scrittura dell'aggiornamento in DynoTable

Assembla visivamente l'UpdateItem e la sua espressione di aggiornamento con Generatore di espressioni DynamoDB — emette il file Clausola SET/ADD più il nome dell'attributo e le mappe dei valori. Nell'app, DynoTable mostra l'elemento risultante dopo il commit di una scrittura a fasi, quindi puoi vedere il nuovo stato direttamente.

Revisione della modifica graduale di un elemento in DynoTable: i valori vecchi e nuovi prima del commit dell'aggiornamento.
Revisione della modifica graduale di un elemento in DynoTable: i valori vecchi e nuovi prima del commit dell'aggiornamento.

Insidie + passaggi successivi

  • Non scrivere GetItem-poi-per leggere un cambiamento — è un viaggio di andata e ritorno e una gara; utilizzare ReturnValues.
  • UPDATED_* restituisce solo gli attributi toccati: se ti serve l'intero articolo, usa ALL_*.
  • PutItem/DeleteItem non può restituire nuovi valori — solo NONE/ALL_OLD.
  • ReturnValues non sostituisce una condizione — per proteggere una scrittura, aggiungere a espressione condizionale; per rileggere il suo effetto, utilizzare ReturnValues. Compongono.
  • Correlati: aggiorna espressioni, contatori atomici.

Vuoi apportare modifiche e vedere la versione precedente all'/after senza scrivere due chiamate? Scarica DynoTable e modifica direttamente i tuoi elementi.

Contatore atomico con UPDATED_NEW

I sistemi di inventario incrementano un campo version o stock ad ogni scrittura. Il il modello è un UpdateItem con ADD stock :inc e ReturnValues: AGGIORNATO_NEW:

UpdateItem  PK=SKU#8842
  UpdateExpression: ADD stock :one
  ExpressionAttributeValues: {":one": {"N": "1"}}
  ReturnValues: UPDATED_NEW
Attributes.stock.N == "41"   (was 40)

Riceverai solo la mappa degli attributi modificata, non l'articolo completo, ideale quando il l'elemento è grande ma il chiamante ha bisogno del nuovo contatore. Per gli audit trail che devono cattura ogni campo prima della modifica, passa a ALL_OLD.

La scrittura viene ancora fatturata come UpdateItem in base alle dimensioni dell'articolo; ReturnValues lo fa non aggiungere un addebito di lettura separato: DynamoDB ha già caricato l'elemento per applicare il aggiornamento.

Nota sulla capacità

La restituzione degli attributi non raddoppia il costo WCU della scrittura stessa. Paghi per la scrittura in base alla dimensione dell'elemento prima e dopo l'aggiornamento per AWS regole, indipendentemente dal numero di attributi visualizzati nel payload della risposta.

Se fossi tentato di usare GetItem e poi UpdateItem per registrare il vecchio valore, tu pagato per una lettura più una scrittura. ReturnValues: ALL_OLD nell'aggiornamento rimuove il file leggi interamente: su un elemento da 2 KB a 500 aggiornamenti al secondo che consente di risparmiare circa 250 RCU eventualmente coerenti al secondo.

Componi con espressioni di condizione

ReturnValues e espressioni di condizione comporre su stessa chiamata. Esempio: incrementa retryCount solo mentre è al di sotto di un limite e restituisce il file nuovo conteggio:

ConditionExpression: retryCount < :max
UpdateExpression: ADD retryCount :one
ReturnValues: UPDATED_NEW

Se la condizione fallisce, DynamoDB restituisce ConditionalCheckFailedException e nessun payload di attributo: distinto da un aggiornamento riuscito con un file vuoto UPDATED_NEW quando non è cambiato nulla.

Utilizzare il costruttore di espressioni per generare il file UpdateExpression, condizione e mappe dei valori raggruppate insieme.

Guida alle decisioni

Hai bisogno di…ImpostazioneFunziona su
Niente indietroNONEInserisci, Aggiorna, Elimina
Articolo completo prima di sovrascrivere/deleteALL_OLDInserisci, Aggiorna, Elimina
Solo campi modificati, primaUPDATED_OLDAggiorna
Articolo completo dopo la patchALL_NEWAggiorna
Solo campi modificati, dopoUPDATED_NEWAggiorna

Elimina e inserisce

DeleteItem con ReturnValues: ALL_OLD è il modo in cui implementi "pop and return" semantica su un elemento della coda: la riga eliminata ritorna in Attributes. C'è no ALL_NEW all'eliminazione perché l'elemento non esiste più.

PutItem con ALL_OLD restituisce l'elemento precedente quando si sovrascrive uno esistente chiave: utile per i flussi di lavoro di scambio. Quando la chiave non esiste, la risposta viene omessa Attributes.

Verificare in DynoTable

Mettere in staging una modifica dell'attributo nell'editor degli elementi: il riquadro di revisione mostra il vecchio e il nuovo valori affiancati prima del commit: le stesse informazioni UPDATED_OLD e UPDATED_NEW ritornerebbe, senza scrivere uno script. Dopo il commit, copia la riga come JSON per dispositivi di prova tramite le azioni di esportazione della griglia.

Aggiornato