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を使用して、既存のアイテムのマップ属性に単一のエントリを追加/更新することはできますか?
DynamoDBSaveExpression
とDynamoDBMapperConfig
で提供されるさまざまなオプションを見てきました。私が見つけることができる最も近いオプションは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);
私は、これら2つの操作をラップするために使用できるトランザクションがないと考えて、複数のステップを避けたいと考えています。 – nalapoke