3 votes

Mise à jour d'un attribut spécifique avec UpdateItemEnhancedRequest DynamoDb java sdk2

Nous avons une table DynamoDB qui contient un compteur d'attributs, qui sera décrémenté de manière asynchrone par plusieurs lambdas en fonction d'un événement. J'essaie de mettre à jour le compteur en utilisant UpdateItemEnhancedRequest (en utilisant le Dynamodb Enhanced Client - JAVA SDK 2). Je suis capable de construire la condition pour mettre à jour le compteur mais cela met à jour l'élément entier et pas seulement le compteur. Quelqu'un peut-il m'expliquer comment mettre à jour un seul attribut à l'aide de DynamoDb Enhanced Client ?

Exemple de code

    public void update(String counter, T item) {

    AttributeValue value = AttributeValue.builder().n(counter).build();

    Map<String, AttributeValue> expressionValues = new HashMap<>();
    expressionValues.put(":value", value);

    Expression myExpression = Expression.builder()
            .expression("nqctr = :value")
            .expressionValues(expressionValues)
            .build();

    UpdateItemEnhancedRequest<T> updateItemEnhancedRequest =
            UpdateItemEnhancedRequest.builder(collectionClassName)
                    .item(item)
                    .conditionExpression(myExpression)
                    .build();

    getTable().updateItem(updateItemEnhancedRequest);

    }

4voto

user1435543 Points 11

Lorsque vous mettez à jour une colonne spécifique, vous devez spécifier la colonne à mettre à jour. Supposons que nous ayons cette table :

enter image description here

Supposons maintenant que nous voulions mettre à jour le archives colonne. Vous devez spécifier la colonne dans votre code. Ici, nous modifions la colonne archives de l'article qui correspond à la clé de l'article. Fermé (mise à jour d'une seule colonne). Remarquez que nous spécifions le nom de la colonne en utilisant l'attribut HashMap objet nommé valeurs actualisées .

// Archives an item based on the key
public String archiveItem(String id){
        DynamoDbClient ddb = getClient();

        HashMap<String,AttributeValue> itemKey = new HashMap<String,AttributeValue>();
        itemKey.put("id", AttributeValue.builder()
                .s(id)
                .build());

        HashMap<String, AttributeValueUpdate> updatedValues =
                new HashMap<String,AttributeValueUpdate>();

        // Update the column specified by name with updatedVal
        updatedValues.put("archive", AttributeValueUpdate.builder()
                .value(AttributeValue.builder()
                        .s("Closed").build())
                .action(AttributeAction.PUT)
                .build());

        UpdateItemRequest request = UpdateItemRequest.builder()
                .tableName("Work")
                .key(itemKey)
                .attributeUpdates(updatedValues)
                .build();

        try {
            ddb.updateItem(request);
            return"The item was successfully archived";

NOTE : Il ne s'agit pas du client amélioré.

Ce code est tiré du tutoriel AWS qui montre comment construire une application web Java en utilisant Spring Boot. Tutoriel complet ici :

Création du tracker d'éléments de l'application web DynamoDB

Pour mettre à jour une seule colonne à l'aide du client étendu, appelez la commande Méthode du tableau . Cela renvoie un instance de DynamoDbTable . Vous pouvez maintenant appeler le updateItem méthode.

Voici la logique qui permet de mettre à jour le archives en utilisant le Enhanced Client. Remarquez que vous obtenez un Travail appelle son objet setArchive puis passer le Travail objet. workTable.updateItem(r->r.item(work)) ;

Code Java :

  // Update the archive column by using the Enhanced Client.
    public String archiveItemEC(String id) {

        DynamoDbClient ddb = getClient();

        try {

            DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                    .dynamoDbClient(getClient())
                    .build();

            DynamoDbTable<Work> workTable = enhancedClient.table("Work", TableSchema.fromBean(Work.class));

            //Get the Key object.
            Key key = Key.builder()
                    .partitionValue(id)
                    .build();

            // Get the item by using the key.
            Work work = workTable.getItem(r->r.key(key));
            work.setArchive("Closed");

            workTable.updateItem(r->r.item(work));
            return"The item was successfully archived";
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
        return "";
    }

Cette réponse montre les deux façons de mettre à jour une seule colonne dans une table DynamoDB. Le tutoriel ci-dessus montre maintenant cette méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X