2016-07-08 5 views
0

AWS Java SDKのDynamoDBMapperを使用していて、かなり単純な項目を扱っています:文字列属性(ハッシュキーとして使用)とマップ属性を持っています。DynamoDBMapperを使用してマップ属性内の既存のエントリを更新します。

@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ですが、これは私が使用しているマップタイプではなく、セットタイプの属性です。

ドキュメント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); 

答えて

0

一つの可能​​な解決策は、次のようになります -

1)DynamoDBMapper負荷に

2を使用して、テーブルから「MyTableというの」データを取得する)ステップで取得したオブジェクトにマップに新しいエントリを追加します。 1以下のように設定したDynamoDBMapperを使用してそのオブジェクトを保存してください

DynamoDBMapperConfig dynamoDBMapperConfig = new DynamoDBMapperConfig(SaveBehavior.UPDATE); 

私はこれが2段階プロセスであることを知っています。しかし、私が同じ状況に陥っていたとき、私は多くを試してみましたが、DynamoDBMapperを使って "Map"データ型のための単一の直接更新では解決策を見つけることができませんでした。

希望すると便利です。

+0

私は、これら2つの操作をラップするために使用できるトランザクションがないと考えて、複数のステップを避けたいと考えています。 – nalapoke

関連する問題