UpdateItem
La solicitud UpdateItem
permite indicar a la función de DynamoDB de AWS AppSync que realice una solicitud UpdateItem
a DynamoDB, así como especificar lo siguiente:
-
La clave del elemento de DynamoDB
-
Una expresión de actualización que describe cómo se actualiza el elemento de DynamoDB
-
Condiciones para que la operación se lleve a cabo correctamente.
La solicitud UpdateItem
tiene la estructura siguiente:
type DynamoDBUpdateItemRequest = { operation: 'UpdateItem'; key: { [key: string]: any }; update: { expression: string; expressionNames?: { [key: string]: string }; expressionValues?: { [key: string]: any }; }; condition?: ConditionCheckExpression; customPartitionKey?: string; populateIndexFields?: boolean; _version?: number; };
Los campos se definen de la siguiente manera:
Campos UpdateItem
-
operation
-
La operación de DynamoDB que se ha de realizar. Para ejecutar la operación de DynamoDB
UpdateItem
, este valor se debe establecer enUpdateItem
. Este valor es obligatorio. -
key
-
La clave del elemento de DynamoDB. Los elementos de DynamoDB pueden tener solo una clave hash o una clave hash y una clave de clasificación, dependiendo de la estructura de la tabla. Para obtener más información sobre cómo especificar un “valor con tipo”, consulte Sistema de tipos (mapeo de solicitud). Este valor es obligatorio.
-
update
-
La sección
update
permite especificar una expresión de actualización que describe cómo se actualiza el elemento en DynamoDB. Para obtener más información sobre el modo de escribir expresiones de actualización, consulte la documentación de DynamoDB UpdateExpressions. Esta sección es obligatoria.La sección
update
tiene tres componentes:-
expression
-
La expresión de actualización. Este valor es obligatorio.
-
expressionNames
-
Las sustituciones de los marcadores de posición de nombre de atributo de expresión, en forma de pares de clave-valor. La clave corresponde a un marcador de posición de nombre usado en la
expression
y el valor tiene que ser una cadena que corresponda al nombre de atributo del elemento en DynamoDB. Este campo es opcional y solo debe rellenarse con las sustituciones de marcadores de posición de nombre de atributo de expresión que se usen en laexpression
. -
expressionValues
-
Las sustituciones de los marcadores de posición de valor de atributo de expresión, en forma de pares de clave-valor. La clave corresponde a un marcador de posición de valor usado en la
expression
y el valor tiene que ser un valor con tipo. Para obtener más información sobre cómo especificar un “valor con tipo”, consulte Sistema de tipos (mapeo de solicitud). Este valor debe especificarse. Este campo es opcional y solo debe rellenarse con las sustituciones de los marcadores de posición de valor de atributo de expresión que se usen en laexpression
.
-
-
condition
-
Una condición para determinar si la solicitud debe realizarse correctamente o no, en función del estado del objeto ya incluido en DynamoDB. Si no se especifica ninguna condición, la solicitud
UpdateItem
actualiza todas las entradas existentes independientemente de su estado actual. Para obtener más información sobre las condiciones, consulte Expresiones de condición. Este valor es opcional. -
_version
-
Valor numérico que representa la última versión conocida de un elemento. Este valor es opcional. Este campo se utiliza para detectar conflictos y solo se admite en orígenes de datos con control de versiones.
customPartitionKey
-
Cuando se habilita, este valor de cadena modifica el formato de los registros
ds_sk
yds_pk
que utiliza la tabla Delta Sync una vez habilitado el control de versiones (para obtener más información, consulte el artículo sobre detección de conflictos y sincronización en la Guía para desarrolladores de AWS AppSync). Cuando se habilita, también lo hace el procesamiento de la entradapopulateIndexFields
. Este campo es opcional. populateIndexFields
-
Valor booleano que, cuando se habilita junto con la
customPartitionKey
, crea nuevas entradas para cada registro de la tabla Delta Sync, específicamente en las columnasgsi_ds_pk
ygsi_ds_sk
. Para obtener más información, consulte el artículo sobre detección de conflictos y sincronización en la Guía para desarrolladores de AWS AppSync. Este campo es opcional.
El elemento que se actualiza en DynamoDB se convierte automáticamente a los tipos primitivos de GraphQL y JSON, y está disponible en el resultado del contexto (context.result
).
Para obtener más información sobre la conversión de tipos de DynamoDB, consulte la sección Sistema de tipos (mapeo de respuestas).
Para obtener más información sobre los solucionadores de JavaScript, consulte el artículo sobre la descripción general de los solucionadores de JavaScript.
Ejemplo 1
El siguiente ejemplo es un controlador de solicitudes de función para la mutación de GraphQL upvote(id: ID!)
.
En este ejemplo, se han incrementado en 1 los campos upvotes
y version
de un elemento de DynamoDB.
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { id } = ctx.args; return { operation: 'UpdateItem', key: util.dynamodb.toMapValues({ id }), update: { expression: 'ADD #votefield :plusOne, version :plusOne', expressionNames: { '#votefield': 'upvotes' }, expressionValues: { ':plusOne': { N: 1 } }, }, }; }
Ejemplo 2
El siguiente ejemplo es un controlador de solicitudes de función para una mutación de GraphQL updateItem(id: ID!, title: String, author: String, expectedVersion:
Int!)
.
Se trata de un ejemplo complejo que inspecciona los argumentos y genera de manera dinámica la expresión de actualización que solo incluye los argumentos que ha proporcionado el cliente. Por ejemplo, si se omiten title
y author
, no se actualizan. Si se especifica un argumento pero su valor es null
, ese campo se elimina del objeto en DynamoDB. Por último, la operación tiene una condición que comprueba si el elemento que está actualmente en DynamoDB tiene el campo version
establecido en expectedVersion
:
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { args: { input: { id, ...values } } } = ctx; const condition = { id: { attributeExists: true }, version: { eq: values.expectedVersion }, }; values.expectedVersion += 1; return dynamodbUpdateRequest({ keys: { id }, values, condition }); } /** * Helper function to update an item * @returns an UpdateItem request */ function dynamodbUpdateRequest(params) { const { keys, values, condition: inCondObj } = params; const sets = []; const removes = []; const expressionNames = {}; const expValues = {}; // Iterate through the keys of the values for (const [key, value] of Object.entries(values)) { expressionNames[`#${key}`] = key; if (value) { sets.push(`#${key} = :${key}`); expValues[`:${key}`] = value; } else { removes.push(`#${key}`); } } let expression = sets.length ? `SET ${sets.join(', ')}` : ''; expression += removes.length ? ` REMOVE ${removes.join(', ')}` : ''; const condition = JSON.parse( util.transform.toDynamoDBConditionExpression(inCondObj) ); return { operation: 'UpdateItem', key: util.dynamodb.toMapValues(keys), condition, update: { expression, expressionNames, expressionValues: util.dynamodb.toMapValues(expValues), }, }; }
Para obtener más información sobre la API UpdateItem
de DynamoDB, consulte la documentación de la API de DynamoDB.