web-dev-qa-db-ja.com

DynamoDBのマップに新しいキーと値のペアを配置するにはどうすればよいですか? (Java)

値が数値から文字列へのマップであるDynamoDB属性があります。新しいキーと値のペアを挿入しようとしています。私が読んだことから、これは可能であるように見えますが、私は方法がわかりません。

私は解決策が以下のリンクにあるものと似ていると思います:

AWS DynamoDBドキュメントAPIでマップまたはリストを更新する方法

しかし、私はこの例が新しいアイテムを地図に入れることについては信じていません。誰かがアイテムをマップに配置する方法を教えてもらえますか?

ありがとう。

編集:

アイテムを取得したくない、ローカルで変更を加えて、元に戻したい。同時に対話する可能性のある複数のクライアントを使用しています(ダイナモによる更新により、競合状態が発生しないことが保証されていると思います)。

19
Denis Li

次のUpdateItemの引数を使用すると、map。#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)"

訪問 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;
}
4
Surajit Kundu