

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

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

Le document de mappage des demandes vous permet de `UpdateItem` demander au résolveur AWS AppSync DynamoDB d'envoyer une `UpdateItem` demande à DynamoDB et de spécifier les éléments suivants :
+ La clé de l'élément dans DynamoDB
+ Expression de mise à jour décrivant comment mettre à jour l'élément dans DynamoDB
+ Conditions de réussite de l'opération

Le document de mappage `UpdateItem` a la structure suivante :

```
{
    "version" : "2018-05-29",
    "operation" : "UpdateItem",
    "customPartitionKey" : "foo",
    "populateIndexFields" : boolean value,
    "key": {
        "foo" : ... typed value,
        "bar" : ... typed value
    },
    "update" : {
        "expression" : "someExpression",
        "expressionNames" : {
           "#foo" : "foo"
       },
       "expressionValues" : {
           ":bar" : ... typed value
       }
    },
    "condition" : {
        ...
    },
    "_version" : 1
}
```

Les champs sont définis comme suit :

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

### UpdateItem liste des champs
<a name="updateitem-list-col"></a>

 **`version`**   
Version de la définition du modèle. `2017-02-28` et `2018-05-29` sont actuellement prises en charge. Cette valeur est obligatoire.

 **`operation`**   
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `UpdateItem`, ce champ doit être défini sur `UpdateItem`. Cette valeur est obligatoire.

 **`key`**   
La clé de l'élément dans DynamoDB. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la spécification d'une « valeur saisie », consultez [Système de types (mappage des demandes).](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md) Cette valeur est obligatoire.

 **`update`**   
La `update` section vous permet de spécifier une expression de mise à jour qui décrit comment mettre à jour l'élément dans DynamoDB. Pour plus d'informations sur la façon d'écrire des expressions de mise à jour, consultez la documentation [ UpdateExpressions DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html). Cette section est obligatoire.  
La section `update` possède trois composants :    
** `expression` **  
Expression de mise à jour. Cette valeur est obligatoire.  
** `expressionNames` **  
Substituts des espaces réservés de *nom* des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé utilisé dans le`expression`, et la valeur doit être une chaîne correspondant au nom d'attribut de l'élément dans DynamoDB. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de nom des attributs de l'expression utilisés dans l'`expression`.  
** `expressionValues` **  
Substituts des espaces réservés de *valeur* des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé de valeur utilisé dans l'`expression`, et la valeur doit être typée. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request.md) Cela doit être spécifié. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de valeur des attributs de l'expression utilisés dans l'`expression`.

 **`condition`**   
Condition permettant de déterminer si la demande doit réussir ou non, en fonction de l'état de l'objet déjà dans DynamoDB. Si aucune condition n'est spécifiée, la requête `UpdateItem` met à jour l'entrée existante quel que soit son état actuel. Pour plus d'informations sur les conditions, consultez la section [Expressions de condition](aws-appsync-resolver-mapping-template-reference-dynamodb-condition-expressions.md). Cette valeur est facultative.

 **`_version`**   
Valeur numérique représentant la dernière version connue d'un élément. Cette valeur est facultative. Ce champ est utilisé pour la *détection de conflits* et n'est pris en charge que sur les sources de données versionnées.

**`customPartitionKey`**  
Lorsqu'elle est activée, cette valeur de chaîne modifie le format des `ds_pk` enregistrements `ds_sk` et utilisés par la table de synchronisation delta lorsque le contrôle des versions a été activé (pour plus d'informations, voir [Détection des conflits et synchronisation](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) dans le *manuel du AWS AppSync développeur*). Lorsque cette option est activée, le traitement de l'`populateIndexFields`entrée est également activé. Ce champ est facultatif.

**`populateIndexFields`**  
Valeur booléenne qui, lorsqu'elle est activée en **même temps que le `customPartitionKey`**, crée de nouvelles entrées pour chaque enregistrement de la table de synchronisation delta, en particulier dans les colonnes `gsi_ds_pk` et`gsi_ds_sk`. Pour plus d'informations, consultez la section [Détection et synchronisation des conflits](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) dans le *manuel du AWS AppSync développeur*. Ce champ est facultatif.

L'élément mis à jour dans DynamoDB est automatiquement converti en types primitifs GraphQL et JSON et est disponible dans le contexte de mappage (). `$context.result`

Pour plus d'informations sur la conversion de type DynamoDB, [voir Système de types (](aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-responses.md)mappage des réponses).

Pour plus d'informations sur les modèles de mappage des réponses, consultez la section [Vue d'ensemble des modèles de mappage Resolver](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview).

## Exemple 1
<a name="id3"></a>

L'exemple suivant est un modèle de mappage pour la mutation GraphQL. `upvote(id: ID!)`

Dans cet exemple, les champs et d'un élément de DynamoDB sont `upvotes` incrémentés de `version` 1.

```
{
    "version" : "2017-02-28",
    "operation" : "UpdateItem",
    "key" : {
        "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id)
    },
    "update" : {
        "expression" : "ADD #votefield :plusOne, version :plusOne",
        "expressionNames" : {
            "#votefield" : "upvotes"
        },
        "expressionValues" : {
            ":plusOne" : { "N" : 1 }
        }
    }
}
```

## Exemple 2
<a name="id4"></a>

L'exemple suivant est un modèle de mappage pour une mutation GraphQL. `updateItem(id: ID!, title: String, author: String, expectedVersion: Int!)`

Il s'agit d'un exemple complexe qui inspecte les arguments et génère dynamiquement l'expression de mise à jour incluant uniquement les arguments qui ont été fournis par le client. Par exemple, si `title` et `author` sont omis, ils ne sont pas mis à jour. Si un argument est spécifié mais que sa valeur l'est`null`, ce champ est supprimé de l'objet dans DynamoDB. Enfin, l'opération comporte une condition qui vérifie si le champ de l'élément actuellement dans DynamoDB est `version` défini comme suit : `expectedVersion`

```
{
    "version" : "2017-02-28",

    "operation" : "UpdateItem",

    "key" : {
        "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id)
    },

    ## Set up some space to keep track of things we're updating **
    #set( $expNames  = {} )
    #set( $expValues = {} )
    #set( $expSet = {} )
    #set( $expAdd = {} )
    #set( $expRemove = [] )

    ## Increment "version" by 1 **
    $!{expAdd.put("version", ":newVersion")}
    $!{expValues.put(":newVersion", { "N" : 1 })}

    ## Iterate through each argument, skipping "id" and "expectedVersion" **
    #foreach( $entry in $context.arguments.entrySet() )
        #if( $entry.key != "id" && $entry.key != "expectedVersion" )
            #if( (!$entry.value) && ("$!{entry.value}" == "") )
                ## If the argument is set to "null", then remove that attribute from the item in DynamoDB **

                #set( $discard = ${expRemove.add("#${entry.key}")} )
                $!{expNames.put("#${entry.key}", "$entry.key")}
            #else
                ## Otherwise set (or update) the attribute on the item in DynamoDB **

                $!{expSet.put("#${entry.key}", ":${entry.key}")}
                $!{expNames.put("#${entry.key}", "$entry.key")}

                #if( $entry.key == "ups" || $entry.key == "downs" )
                    $!{expValues.put(":${entry.key}", { "N" : $entry.value })}
                #else
                    $!{expValues.put(":${entry.key}", { "S" : "${entry.value}" })}
                #end
            #end
        #end
    #end

    ## Start building the update expression, starting with attributes we're going to SET **
    #set( $expression = "" )
    #if( !${expSet.isEmpty()} )
        #set( $expression = "SET" )
        #foreach( $entry in $expSet.entrySet() )
            #set( $expression = "${expression} ${entry.key} = ${entry.value}" )
            #if ( $foreach.hasNext )
                #set( $expression = "${expression}," )
            #end
        #end
    #end

    ## Continue building the update expression, adding attributes we're going to ADD **
    #if( !${expAdd.isEmpty()} )
        #set( $expression = "${expression} ADD" )
        #foreach( $entry in $expAdd.entrySet() )
            #set( $expression = "${expression} ${entry.key} ${entry.value}" )
            #if ( $foreach.hasNext )
                #set( $expression = "${expression}," )
            #end
        #end
    #end

    ## Continue building the update expression, adding attributes we're going to REMOVE **
    #if( !${expRemove.isEmpty()} )
        #set( $expression = "${expression} REMOVE" )

        #foreach( $entry in $expRemove )
            #set( $expression = "${expression} ${entry}" )
            #if ( $foreach.hasNext )
                #set( $expression = "${expression}," )
            #end
        #end
    #end

    ## Finally, write the update expression into the document, along with any expressionNames and expressionValues **
    "update" : {
        "expression" : "${expression}"
        #if( !${expNames.isEmpty()} )
            ,"expressionNames" : $utils.toJson($expNames)
        #end
        #if( !${expValues.isEmpty()} )
            ,"expressionValues" : $utils.toJson($expValues)
        #end
    },

    "condition" : {
        "expression"       : "version = :expectedVersion",
        "expressionValues" : {
            ":expectedVersion" : $util.dynamodb.toDynamoDBJson($ctx.args.expectedVersion)
        }
    }
}
```

Pour de plus amples informations sur l'API de DynamoDB `UpdateItem`, veuillez consulter la [Documentation sur les API de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html).