2016-04-28 101 views
11

我试图在AWS DynamoDB表中存储字符串数组。大多数情况下,这个数组至少会填充一个字符串。但是,数组可能是空的。如何处理AWS DynamoDB中的空字符串集合

我在Java Lambda函数中创建了一个DynamoDB模型,该函数将一组字符串作为它的一个属性。如果在字符串集为空时尝试保存DynamoDB模型,则会给我一个错误,说我无法在DynamoDB中存储空集。

所以我的问题是,如何处理从我的模型中删除该设置属性之前,我保存/更新它在DynamoDB中?

下面是一个模型的例子。

@DynamoDBTable(tableName = "group") 
public class Group { 
    private String _id; 
    private Set<String> users; 

    @Null 
    @DynamoDBHashKey 
    @DynamoDBAutoGeneratedKey 
    public String getId() { 
     return _id; 
    } 

    public void setId(final String id) { 
     _id = id; 
    } 

    @DynamoDBAttribute 
    public Set<String> getUsers(){ 
     return users; 
    } 

    public void setUsers(final Set<String> users) { 
     this.users = users; 
    } 

    public void addUser(String userId) { 
     if(this.users == null){ 
      this.setUsers(new HashSet<String>(Arrays.asList(userId))); 
     }else{ 
      this.getUsers().add(userId); 
     } 
    } 
} 

第一次当我创建一个组。它可以没有用户,也可以有一个或多个用户。

+0

基于我与AWS技术支持人员就此进行的进一步交谈,听起来好像公认的做法是实际删除现有项目并重新创建具有相同主索引的新项目,而忽略属性为空的项目。我试过这个,没有任何运气。 –

+0

那意味着我们不能在这种情况下使用任何Java POJO类? –

回答

0

当它回到实际问题时,是因为我继承的代码将DynamoDBMapperConfig上的SaveBehavior设置为UPDATE_SKIP_NULL_ATTRIBUTES,它跳过空值并因此不会将它们从DynamoDB中删除。看到这个解释所有不同保存行为的文章。 https://java.awsblog.com/post/Tx1MH3BFPW8FX6W/Using-the-SaveBehavior-Configuration-for-the-DynamoDBMapper

详细说明这一点。

我在我的JAVA项目中设置DynamoDBMapperConfig.SaveBehavior。

_dynamoDBMapperConfig = new DynamoDBMapperConfig.Builder() .withSaveBehavior(SaveBehavior.UPDATE) .withTableNameResolver(TABLE_NAME_RESOLVER) .withConversionSchema(ConversionSchemas.V2) .build();

然后,每当您更新具有映射@DynamoDBAttribute模型还需要设定特定值(NULL)。

user.setFirstName(null) 

这是我发现可以从DynamoDB条目中删除属性的最简单方法。

1

这是一个老问题,但我会解决这个问题的方式是自定义DynamoDBMarshaller

使用@DynamoDBMarshalling注释,您可以修饰POJO访问器方法,以便向DynamoDB映射器指示哪个编组器类用于序列化和反序列化字符串集。这样你可以控制特殊用例。

这里也是一个link to an AWS blog post with an example

一个需要注意与上述方法是客户编组溶液序列化和从字符串反序列化到/以便在数据库中的表示将不是一个组本身。但是,我不认为这太糟糕。

另一种方法可能是使用Document API而不是对象映射器,它可以让您完全控制项目。虽然我仍然会使用带有字符串背景的自定义映射器。

+0

谢谢!我会试着实现这一点。 –