使用DynamoDBMapper

时间:2016-07-08 18:54:03

标签: java amazon-web-services amazon-dynamodb

我使用AWS Java SDK中的DynamoDBMapper并使用一个相当简单的项目:它有一个字符串属性(用作哈希键)和一个map属性。

@DynamoDBTable(tableName = "MyTable")
public class MyItem {
    private String myStringAttr;
    private Map<String, String> myMapAttr;

    @DynamoDBHashKey(attributeName = "MyStringAttribute")
    public String getMyKeyAttr() { return myKeyAttr; }
    public void setMyKeyAttr(String myKeyAttr) { this.myKeyAttr = myKeyAttr; }

    @DynamoDBAttribute(attributeName = "MyMapAttribute")
    public Map<String, String> getMyMapAttr() { return myMapAttr; }
    public void setMyMapAttr(Map<string, string> myMapAttr) { this.myMapAttr = myMapAttr; }
}

我可以使用load()save()方法读取和编写我的对象。我遇到的问题是当我需要在地图中更新或添加表中现有项目的单个条目时。在不知道所述项目的地图的现有条目的情况下(我不想在每次尝试更新或添加之前执行load()),我似乎能够做的最好的就是擦除整个地图并将其替换为我尝试更新或添加的单个条目。 是否可以使用DynamoDBMapper向现有项目的地图属性添加/更新单个条目?

我查看了DynamoDBSaveExpressionDynamoDBMapperConfig提供的各种选项。我能找到的最接近的选项是DynamoDBMapperConfig.SaveBehavior.APPEND_SET,但这适用于集类型属性,而不是我使用的地图类型。

我可以使用Document API的updateItem()方法以及包含UpdateExpression的UpdateItemSpec来实现这个确切的用例,如下所示。如果给定的密钥尚不存在,这将向地图添加新条目,或者如果现有条目确实存在,则将值更新为特定的条目,所有条目都不会触及地图中的其他条目。但是,我发现Document API相当麻烦,如果可能的话,我更愿意坚持使用DynamoDBMapper

Table table = dynamoDB.getTable("MyTable");

UpdateItemSpec updateItemSpec = new UpdateItemSpec()
    .withPrimaryKey("MyStringAttribute", 1)
    .withUpdateExpression("set #mma.#mek = :mev")
    .withNameMap(new NameMap()
        .with("#mma", "MyMapAttribute")
        .with("#mek", "SomeMapEntryKey")
    .withValueMap(new ValueMap()
        .withString(":mev", "Some map entry value"));

UpdateItemOutcome outcome =  table.updateItem(updateItemSpec);

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是: -

1)使用DynamoDBMapper load

从“MyTable”表中获取数据

2)在步骤1中检索到的对象中向地图添加新条目,并使用带有配置的DynamoDBMapper保存该对象,如下所述

DynamoDBMapperConfig dynamoDBMapperConfig = new DynamoDBMapperConfig(SaveBehavior.UPDATE);

我知道这是一个两步的过程。但是,当我处于相同的情况时,我已经尝试了很多,并且找不到使用DynamoDBMapper对“Map”数据类型进行单一直接更新的任何解决方案。

希望这有帮助!