我对亚马逊的AWS及其Java的API很新,所以我不确定什么是我尝试做的最有效的方法.基本上,我正在尝试设置一个数据库,用于存储项目的ID,它的状态,以及用户上传到S3存储桶时的存储桶和位置.我遇到的问题是获取状态属性下状态为“就绪”的所有项目ID的列表.任何状态为“就绪”的项目都需要将其ID号加载到数组或arraylist中以供日后参考.有什么建议?
最佳答案
执行此操作的方法是使用扫描API.但是,这意味着发电机需要查看表中的每个项目,并检查其属性“status”是否等于“ready”.此操作的成本很高,并且会向您收取阅读表格中每个项目的费用.
代码看起来像这样:
Condition scanFilterCondition = new Condition()
.withComparisonOperator(ComparisonOperator.EQ.toString())
.withAttributeValueList(new AttributeValue().withS("ready"));
Map
虽然它需要对数据进行非规范化,但有一种方法可以使其更好.尝试使用散列键“status”和范围键“project ID”保留第二个表.这是您现有表格的补充.这将允许您使用查询API(扫描更便宜的表兄弟),并询问其所有项目的哈希键为“就绪”.这将为您提供所需项目ID的列表,然后您可以从已有的项目ID表中获取它们.
这个代码看起来像这样:
QueryRequest queryRequest = new QueryRequest()
.withTableName("ProductByStatus")
.withHashKeyValue(new AttributeValue().withS("ready"));
QueryResult result = client.query(queryRequest);
这种方法的缺点是,每当更新状态字段时都必须更新两个表,并且必须确保它们保持同步. Dynamo不提供事务性,因此您必须为主项目表的更新成功,但您的辅助状态表不成功的情况做好准备.或相反亦然.
进一步参考:http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html