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.
ReturnValuesrestituisce 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/DeleteItemaccetta soloNONEoALL_OLD;UpdateItemaccetta 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:
GetItemper leggere lo stato corrente,UpdateItemper 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:
ReturnValues | Resi | Utilizzare quando |
|---|---|---|
NONE | niente | non è necessario che l'elemento venga restituito (impostazione predefinita) |
ALL_OLD | intero articolo, pre-scrivere | auditing / "cosa ho appena sostituito?" |
UPDATED_OLD | attributi modificati, pre-scrivi | ti interessano solo i campi che hai toccato |
ALL_NEW | intero articolo, post-scrivi | è necessario che l'elemento nuovo e completo venga restituito a un chiamante |
UPDATED_NEW | attributi modificati, post-scrittura | rileggendo 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.

Insidie + passaggi successivi
- Non scrivere
GetItem-poi-per leggere un cambiamento — è un viaggio di andata e ritorno e una gara; utilizzareReturnValues. UPDATED_*restituisce solo gli attributi toccati: se ti serve l'intero articolo, usaALL_*.PutItem/DeleteItemnon può restituire nuovi valori — soloNONE/ALL_OLD.ReturnValuesnon sostituisce una condizione — per proteggere una scrittura, aggiungere a espressione condizionale; per rileggere il suo effetto, utilizzareReturnValues. 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_NEWSe 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… | Impostazione | Funziona su |
|---|---|---|
| Niente indietro | NONE | Inserisci, Aggiorna, Elimina |
| Articolo completo prima di sovrascrivere/delete | ALL_OLD | Inserisci, Aggiorna, Elimina |
| Solo campi modificati, prima | UPDATED_OLD | Aggiorna |
| Articolo completo dopo la patch | ALL_NEW | Aggiorna |
| Solo campi modificati, dopo | UPDATED_NEW | Aggiorna |
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.


