dynamoDb - 如果没有已添加到表中的类似项,则添加新项

时间:2016-05-18 16:12:30

标签: java amazon-dynamodb

使用dynamoDb的DynamoDBMapper我需要执行以下操作:
1.检查具有已知leaderId和userId的Follower是否已添加到Follower表中 2.如果找到这样的追随者 - 将其状态改为" ACTIVE"
3.如果找不到这样的追随者 - 用给定的leaderId / followerId存储新的追随者并声明" ACTIVE"

随着我们使用州管理工作流程,将在整个申请中使用关注者的状态 (我们尽量不删除数据库中的任何数据。)

简化"追随者"类:

public class Follower {

@DynamoDBHashKey
@DynamoDBAutoGeneratedKey
private String id;

    private String leaderId;
    private String followerId;
    private String state;
}

我目前的解决方案是     1.使用DynamoDBMapper加载符合给定leaderID / followerId参数的Follower-s列表     2.如果没有结果 - 我们生成一个新的追随者,否则我们更新现有的一个

但是我希望在一个DynamoDBMapper调用中能够更加优雅""解决方案存在。

public void follow(String leaderId, String followerId) {
    Follower follower = findFollower(leaderId, followerId);

    if(follower == null){
        follower = new Follower();
        follower.setLeaderId(leaderId);
        follower.setFollowerId(followerId);
    } else {
        follower.getBase().setState("ACTIVE");
    }

    getDbMapper().save(follower);
}

1 个答案:

答案 0 :(得分:1)

您可以使用DynamoDBMapperConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES

我之前遇到过同样的问题。我可以使用以下功能解决它。

/**
     * It's either save or update if the record is exist using param Follower data
     *
     * @param Follower object of the follower data
     */
    private static void saveOrUpdateAccountOperation(Follower  followerData) {
        AmazonDynamoDBClient amazonDynamoDBClient;
        if (CognitoSyncClientManager.getInstance().isUserLogin()) {
            amazonDynamoDBClient = new AmazonDynamoDBClient(CognitoSyncClientManager.getInstance().getCredentialsProvider());
        } else {
            amazonDynamoDBClient = new AmazonDynamoDBClient(AWSMobileClient.defaultMobileClient().getIdentityManager().getCredentialsProvider());
        }
        // UPDATE_SKIP_NULL_ATTRIBUTES is similar to UPDATE, except that it ignores any null value attribute(s) and will NOT remove them from that item in DynamoDB.
        DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(amazonDynamoDBClient,
                new DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES));
        // create or update the existing record
        dynamoDBMapper.save(followerData);
    }

您只需将您的追随者对象传递给此功能,它将照顾您的所有三个条件。

  1. 如果Follower对象leaderId和userId不存在,那么它将创建它并添加所有其他具有默认值的属性。
  2. 如果给定的关注者会找到,那么请确保您的关注者类状态属性内容值为“ACTIVE”,它只会更新该属性。
  3. 谢谢。