我对亚马逊的 AWS 和它的 Java API 还很陌生,所以我不确定我想要做的最有效的方法是什么。基本上,我正在尝试设置一个数据库,该数据库将存储项目的 ID、状态以及用户上传到 S3 存储桶时的存储桶和位置。我遇到的问题是获取状态属性下状态为“就绪”的所有项目 ID 的列表。任何处于“就绪”状态的项目都需要将其 ID 号加载到数组或数组列表中以供以后参考。有什么建议吗?
问问题
10432 次
1 回答
4
这样做的方法是使用扫描 API。但是,这意味着 dynamo 需要查看表中的每个项目,并检查其属性“status”是否等于“ready”。此操作的成本会很大,并且会因读取表中的每个项目而向您收费。
代码看起来像这样:
Condition scanFilterCondition = new Condition()
.withComparisonOperator(ComparisonOperator.EQ.toString())
.withAttributeValueList(new AttributeValue().withS("ready"));
Map<String, Condition> conditions = new HashMap<String, Condition>();
conditions.put("status", scanFilterCondition);
ScanRequest scanRequest = new ScanRequest()
.withTableName("MasterProductTable")
.withScanFilter(conditions);
ScanResult result = client.scan(scanRequest);
有一种方法可以使它变得更好,尽管它需要对您的数据进行非规范化。尝试使用“状态”的哈希键和“项目 ID”的范围键保留第二个表。这是对现有表的补充。这将允许您使用 Query API(scan 的便宜得多的表亲),并要求它提供哈希键为“ready”的所有项目。这将为您提供所需的项目 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
于 2012-11-27T01:57:31.760 回答