如何将新的键值对放入DynamoDB中的地图中? (JAVA)

时间:2015-06-30 14:34:15

标签: java amazon-dynamodb

我有一个DynamoDB属性,其值是从Number到String的映射。我试图放入一个新的键值对。从我所读到的,这似乎是可能的,但我不知道如何。

我认为解决方案类似于以下链接中的解决方案:

How to update a Map or a List on AWS DynamoDB document API?

但我不相信这个例子是将新项目放入地图。有人可以告诉我如何将项目放入地图吗?

感谢。

编辑:

我不想获取该项目,在本地进行更改并将其恢复。我正在与可能同时进行交互的多个客户合作(我假设发电机更新确保没有竞争条件)。

2 个答案:

答案 0 :(得分:19)

使用以下UpdateItem参数,您可以条件在映射时在#number处添加映射条目。#number在地图中不存在:

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)"

答案 1 :(得分:4)

访问http://www.tryyourskill.com/aws/insert-or-append-key-values-map-in-dynamodb-using-java可能会帮助您使用代码段在地图列中添加或附加值

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;
}