

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# UpdateItem
<a name="js-aws-appsync-resolver-reference-dynamodb-updateitem"></a>

La `UpdateItem` solicitud le permite indicar a la función de AWS AppSync DynamoDB que realice una `UpdateItem` solicitud a DynamoDB y le permite 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:

## UpdateItem campos
<a name="js-updateitem-list"></a>

### UpdateItem lista de campos
<a name="js-updateitem-list-col"></a>

 **`operation`**   
La operación de DynamoDB que se ha de realizar. Para ejecutar la operación de DynamoDB `UpdateItem`, este valor se debe establecer en `UpdateItem`. 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)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). 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 cómo escribir expresiones de actualización, consulte la documentación de [ UpdateExpressions DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html). 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 la `expression`.  
** `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)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). 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 la `expression`.

 **`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](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-condition-expressions). 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 está activado, este valor de cadena modifica el formato `ds_sk` y los `ds_pk` registros utilizados por la tabla de sincronización delta cuando se ha activado el control de versiones (para obtener más información, consulte [Detección de conflictos y sincronización](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) en la AWS AppSync Guía para desarrolladores).* Cuando se habilita, también lo hace el procesamiento de la entrada `populateIndexFields`. 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 columnas `gsi_ds_pk` y `gsi_ds_sk`. Para obtener más información, consulte el artículo sobre [detección de conflictos y sincronización](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) 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)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses).

[Para obtener más información sobre los JavaScript solucionadores, consulta JavaScript la descripción general de los solucionadores.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

## Ejemplo 1
<a name="js-id3"></a>

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
<a name="js-id4"></a>

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](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html).