Intermedio6 min de lectura

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.

  • ReturnValues devuelve 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/DeleteItem acepta solo NONE o ALL_OLD; UpdateItem acepta 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:

  1. GetItem para leer el estado actual,
  2. UpdateItem para 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:

ReturnValuesDevolucionesUsar cuando
NONEnadano necesitas que te devuelvan el artículo (predeterminado)
ALL_OLDartículo completo, preescrituraauditoría / "¿qué acabo de reemplazar?"
UPDATED_OLDatributos cambiados, preescriturasólo te importan los campos que tocaste
ALL_NEWartículo completo, post-escrituranecesita el artículo completo y nuevo para devolverlo a la persona que llama
UPDATED_NEWatributos cambiados, post-escrituravolver 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.

Revisar el cambio por etapas de un elemento en DynoTable: los valores antiguos y nuevos antes de que se confirme la actualización.
Revisar el cambio por etapas de un elemento en DynoTable: los valores antiguos y nuevos antes de que se confirme la actualización.

Escollos + próximos pasos

  • No GetItem-luego-escribas para leer sobre un cambio: es un viaje de ida y vuelta y una carrera; utilice ReturnValues.
  • UPDATED_* devuelve solo los atributos tocados — si necesita el artículo completo, use ALL_*.
  • PutItem/DeleteItem no puede devolver nuevos valores: solo NONE/ALL_OLD.
  • ReturnValues no sustituye a una condición — para guardar una escritura, agregue una expresión de condición; para leer de nuevo su efecto, utilice ReturnValues. 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_NEW

Si 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ónTrabaja en
Nada de vueltaNONEPoner, Actualizar, Eliminar
Elemento completo antes de sobrescribir/eliminarALL_OLDPoner, Actualizar, Eliminar
Sólo campos modificados, antesUPDATED_OLDActualización
Artículo completo después del parcheALL_NEWActualización
Sólo campos modificados, despuésUPDATED_NEWActualizació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.

Actualizado