5

我对亚马逊的 AWS 和它的 Java API 还很陌生,所以我不确定我想要做的最有效的方法是什么。基本上,我正在尝试设置一个数据库,该数据库将存储项目的 ID、状态以及用户上传到 S3 存储桶时的存储桶和位置。我遇到的问题是获取状态属性下状态为“就绪”的所有项目 ID 的列表。任何处于“就绪”状态的项目都需要将其 ID 号加载到数组或数组列表中以供以后参考。有什么建议吗?

4

1 回答 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 回答