web-dev-qa-db-fra.com

Comment mettre une nouvelle paire clé-valeur dans une carte dans DynamoDB? (Java)

J'ai un attribut DynamoDB dont la valeur est une carte d'un nombre à une chaîne. J'essaie de mettre une nouvelle paire valeur/clé. D'après ce que j'ai lu, cela semble possible, mais je ne sais pas comment.

Je suppose que la solution est similaire à celle du lien ci-dessous:

Comment mettre à jour une carte ou une liste sur l'API de document AWS DynamoDB?

Mais je ne crois pas que l'exemple concerne la mise en place d'un nouvel élément sur une carte. Quelqu'un pourrait-il me montrer comment mettre un élément sur une carte?

Merci.

ÉDITER:

Je ne veux pas récupérer l'article, apporter localement les modifications et le remettre. Je travaille avec plusieurs clients qui pourraient interagir simultanément (et je suppose que la mise à jour par dynamo garantit qu'il n'y aura pas de conditions de concurrence).

19
Denis Li

Avec les arguments suivants pour UpdateItem, vous pouvez conditionner l'ajout d'une entrée de carte à # numéro lorsque la carte. # Numéro n'existe pas déjà dans la carte:

UpdateExpression = "SET map.#number = :string"
ExpressionAttributeNames = { "#number" : "1" }
ExpressionAttributeValues = { ":string" : "the string to store in the map at key value 1" }
ConditionExpression = "attribute_not_exists(map.#number)"
26

Visitez http://www.tryyourskill.com/aws/insert-or-append-key-values-map-in-dynamodb-using-Java peut vous aider avec l'extrait de code à ajouter ou à ajouter valeurs dans la colonne de la carte

public boolean insertKeyValue(String tableName, String primaryKey, String 
    primaryKeyValue, String updateColumn, String newKey, String newValue) {

    //Configuration to connect to DynamoDB
    Table table = dynamoDB.getTable(tableName);
    boolean insertAppendStatus = false;
    try {
        //Updates when map is already exist in the table
        UpdateItemSpec updateItemSpec = new UpdateItemSpec()
            .withPrimaryKey(primaryKey, primaryKeyValue)
            .withReturnValues(ReturnValue.ALL_NEW)
            .withUpdateExpression("set #columnName." + newKey + " = :columnValue")
            .withNameMap(new NameMap().with("#columnName", updateColumn))
            .withValueMap(new ValueMap().with(":columnValue", newValue))
            .withConditionExpression("attribute_exists("+ updateColumn +")");

        table.updateItem(updateItemSpec);
        insertAppendStatus = true;
    //Add map column when it's not exist in the table
    } catch (ConditionalCheckFailedException e) {
        HashMap<String, String> map =  new HashMap<>();
        map.put(newKey, newValue);
        UpdateItemSpec updateItemSpec = new UpdateItemSpec()
            .withPrimaryKey(primaryKey,primaryKeyValue)
            .withReturnValues(ReturnValue.ALL_NEW)
            .withUpdateExpression("set #columnName = :m")
            .withNameMap(new NameMap().with("#columnName", updateColumn))
            .withValueMap(new ValueMap().withMap(":m", map));

        table.updateItem(updateItemSpec);
        insertAppendStatus = true;
    } catch(Exception e) {
        e.printStackTrace();
    }
    return insertAppendStatus;
}
4
Surajit Kundu