DynamoDB ReturnValues: Obtenga el artículo antiguo o nuevo
De forma predeterminada, una escritura DynamoDB no devuelve nada más que éxito. Pero a menudo necesitas los datos.
alrededor de la escritura: el valor antes de cambiarlo o el valor nuevo después. el
La solución ingenua es una segunda GetItem, que es un viaje de ida y vuelta adicional y una carrera: alguien
otros pueden escribir en el medio. DynamoDB evita ambos con el parámetro ReturnValues,
que devuelve el elemento antiguo o nuevo de forma atómica como parte de la escritura misma.
¿Qué hace ReturnValues en DynamoDB?
ReturnValues le dice a DynamoDB que escriba para devolver el artículo como parte de la misma llamada, por lo que se salta un segundo GetItem y la carrera que crea. PutItem y DeleteItem aceptan NONE o ALL_OLD; UpdateItem acepta los cinco (NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW), devolviendo valores antiguos o nuevos de forma atómica.
ReturnValuesdevuelve el elemento como parte de la escritura: sin segunda lectura, sin carrera.NONE(predeterminado): no devuelve nada.ALL_OLD: el elemento completo como estaba antes de la escritura.UPDATED_OLD: solo los atributos que cambió la actualización, antes de los valores.ALL_NEW: el elemento completo después de la escritura.UPDATED_NEW: solo los atributos modificados, después de los valores.PutItem/DeleteItemacepta soloNONEoALL_OLD;UpdateItemacepta todos cinco.
El problema: necesitas el valor que acabas de sobrescribir
Supongamos que ejecuta una mesa de soporte y un agente cambia el estado de un ticket de open a
pending. Su registro de auditoría debe registrar cuál era el estado antes del cambio.
Sin ReturnValues:
GetItempara leer el estado actual,UpdateItempara configurar el nuevo.
Entre los pasos 1 y 2, otro agente podría cambiar el estado; ahora su registro de auditoría records
un valor obsoleto "antes". Peor aún, son dos llamadas para una operación lógica. ReturnValues
lo colapsa en un solo atómico UpdateItem que devuelve el estado anterior tal como
En realidad estaba en el momento de escribir.
Las cinco opciones y cuándo usar cada una
UpdateItem admite el conjunto completo; la elección es qué porción del artículo y cuál
lado de la escritura necesitas:
ReturnValues | Devoluciones | Usar cuando |
|---|---|---|
NONE | nada | no necesitas que te devuelvan el artículo (predeterminado) |
ALL_OLD | artículo completo, preescritura | auditoría / "¿qué acabo de reemplazar?" |
UPDATED_OLD | atributos cambiados, preescritura | sólo te importan los campos que tocaste |
ALL_NEW | artículo completo, post-escritura | necesita el artículo completo y nuevo para devolverlo a la persona que llama |
UPDATED_NEW | atributos cambiados, post-escritura | volver a leer un contador/valor que acaba de incrementar |
UPDATED_NEW es el héroe cotidiano: incrementa un contador con un
actualizar expresión y leer el nuevo total nuevamente en
la misma llamada, sin carrera. Para la auditoría del ticket de soporte, ALL_OLD (o UPDATED_OLD si
solo registra el campo de estado) captura el estado previo al cambio de forma atómica.
Tenga en cuenta la asimetría: PutItem y DeleteItem solo admiten NONE y ALL_OLD —
no hay ningún valor "nuevo" que devolver para una eliminación, y el nuevo valor de una venta es justo lo que
enviado. Sólo UpdateItem, que muta en el lugar, ofrece los cinco.
AWS documentos
la matriz exacta.
Escribiendo la actualización en DynoTable
Ensamble el UpdateItem y su expresión de actualización visualmente con el
DynamoDB generador de expresiones — emite el
SET/ADD cláusula más los mapas de nombre de atributo y valor. En la aplicación, DynoTable
muestra el elemento resultante después de que se confirma una escritura por etapas, para que pueda ver el nuevo estado
directamente.

Escollos + próximos pasos
- No
GetItem-luego-escribas para leer sobre un cambio: es un viaje de ida y vuelta y una carrera; utiliceReturnValues. UPDATED_*devuelve solo los atributos tocados — si necesita el artículo completo, useALL_*.PutItem/DeleteItemno puede devolver nuevos valores: soloNONE/ALL_OLD.ReturnValuesno sustituye a una condición — para guardar una escritura, agregue una expresión de condición; para leer de nuevo su efecto, utiliceReturnValues. Ellos componen.- Relacionado: actualizar expresiones, contadores atómicos.
¿Quiere realizar ediciones y ver el antes y el después sin programar dos llamadas? Descarga DynoTable y edita tus elementos directamente.
Contador atómico con UPDATED_NEW
Los sistemas de inventario incrementan un campo version o stock en cada escritura. el
El patrón es un UpdateItem con ADD stock :inc y ReturnValues: UPDATED_NEW:
UpdateItem PK=SKU#8842
UpdateExpression: ADD stock :one
ExpressionAttributeValues: {":one": {"N": "1"}}
ReturnValues: UPDATED_NEW
→ Attributes.stock.N == "41" (was 40)Recibirá solo el mapa de atributos modificado, no el elemento completo; ideal cuando el
El elemento es grande pero la persona que llama necesita el nuevo contador. Para pistas de auditoría que deben
capture todos los campos antes del cambio, cambie a ALL_OLD.
La escritura aún se factura como UpdateItem en el tamaño del artículo; ReturnValues hace
no agregar un cargo de lectura separado: DynamoDB ya cargó el elemento para aplicar el
actualizar.
Nota de capacidad
La devolución de atributos no duplica el costo de WCU de la escritura en sí. tu pagas para la escritura basada en el tamaño del elemento antes y después de la actualización según AWS reglas, independientemente de cuántos atributos aparecen en la respuesta payload.
Si tuvo la tentación de GetItem y luego UpdateItem para registrar el valor anterior,
pagado por una lectura más una escritura. ReturnValues: ALL_OLD en la actualización elimina el
leer por completo: en un elemento de 2 KB con 500 actualizaciones por segundo, lo que ahorra aproximadamente
250 RCU eventualmente consistentes por segundo.
Redactar con expresiones de condición
ReturnValues y las
expresiones de condición se componen en la
misma llamada. Ejemplo: incrementar retryCount solo mientras esté por debajo de un
límite, y devolver el nuevo recuento:
ConditionExpression: retryCount < :max
UpdateExpression: ADD retryCount :one
ReturnValues: UPDATED_NEWSi la condición falla, DynamoDB devuelve ConditionalCheckFailedException y
sin payload de atributos: distinto de una actualización exitosa con un UPDATED_NEW
vacío cuando nada cambió.
Utilice el generador de expresiones para generar el
UpdateExpression, condición y marshalled valores se asignan juntos.
Guía de decisiones
| Necesitas… | Configuración | Trabaja en |
|---|---|---|
| Nada de vuelta | NONE | Poner, Actualizar, Eliminar |
| Elemento completo antes de sobrescribir/eliminar | ALL_OLD | Poner, Actualizar, Eliminar |
| Sólo campos modificados, antes | UPDATED_OLD | Actualización |
| Artículo completo después del parche | ALL_NEW | Actualización |
| Sólo campos modificados, después | UPDATED_NEW | Actualización |
Elimina y pone
DeleteItem con ReturnValues: ALL_OLD es como se implementa "pop and return"
semántica en un elemento de la cola: la fila eliminada vuelve en Attributes. hay
no ALL_NEW al eliminar porque el elemento ya no existe.
PutItem con ALL_OLD devuelve el elemento anterior cuando sobrescribe uno existente
clave: útil para flujos de trabajo de intercambio. Cuando la clave no existía, la respuesta omite
Attributes.
Verificar en DynoTable
Organizar un cambio de atributo en el editor de elementos: el panel de revisión muestra lo antiguo y lo nuevo
valores uno al lado del otro antes de la confirmación: la misma información UPDATED_OLD y
UPDATED_NEW regresaría, sin escribir un guión. Después de confirmar, copie la fila.
como JSON para dispositivos de prueba a través de las acciones de exportación de la cuadrícula.


