Amazon DynamoDB获取属性值为...的项目(Java API)

DGo*_*erg 5 java attributes arraylist amazon-dynamodb

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

Cor*_*all 5

执行此操作的方法是使用扫描 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);
Run Code Online (Sandbox Code Playgroud)

有一种方法可以让它变得更好,尽管它需要对数据进行非规范化。尝试保留第二个表,其散列键为“状态”,范围键为“项目 ID”。这是对现有表的补充。这将允许您使用查询 API(扫描的便宜得多的表弟),并询问其散列键为“ready”的所有项目。这将为您提供所需的项目 ID 列表,然后您可以从已有的项目 ID 表中获取它们。

其代码如下所示:

QueryRequest queryRequest = new QueryRequest()
    .withTableName("ProductByStatus")
    .withHashKeyValue(new AttributeValue().withS("ready"));

QueryResult result = client.query(queryRequest);
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是每当更新状态字段时都必须更新两个表,并且必须确保它们保持同步。Dynamo 不提供事务性,因此您必须准备好应对主项目表更新成功但辅助状态表未成功的情况。或相反亦然。

如需进一步参考:http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html