在开发过程中需要使用到DynamoDB,第一反应是使用Spring Data的DynamoDB 相关框架。找到的开源框架的支持CRUD, 但是对于conditional update等的实现并不完善。于是决定自己实现一个 DynamoDB 的 DAO,主要使用DynamoDBMapper object.
使用过程中遇到了一些问题:
1. 对应table的model object序员@DynamoDBTable注释,partition key 和 sort key 分别对应 @DynamoDBHashKey 和@DynamoDBSortKey。其余对象变量的setter用@DynamoDBAttribute注释。
2. DynamoDB 支持的数据类型有这些, 其中需要注意的是:SS(String Set), NS(Number Set), L(List), M(Map)。SS和NS不支持文档类。Set不能反序列化成TreeSet,且添加的SS不能为空
3.model object 中的自定义对象需要用@DynamoDBDocument注释,对象定义中也需要加上@DynamoDBAttribute注释, 序列化时自定义对象会被转成M
4.所有需要序列化的对象必须有一个zero argument constructor 和对应的setter,这是DynamoDBMapper反序列化对象的工具
5.可以通过添加DynamoDBMapper.save()的 DynamoDBMapperConfig 参数来更新/添加某一项的attribute(图片链接):
6. 用AWS SDK构建一个cli 表达式的大致语法如下:
UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("mp", mp, "nodeNumber", nodeNumber)
//.withUpdateExpression(" info.rating = :r, info.plot=:p, info.actors=:a")
.withUpdateExpression("DELETE words :p")
.withValueMap(new ValueMap().withStringSet(":p", set))
.withReturnValues(ReturnValue.UPDATED_NEW);
关键的内容有: key, updateExpression, expressionAttributeValue(withValueMap), withReturnValue, reference