范围键未知时如何查询 DynamoDB

gri*_*gon 3 amazon-web-services amazon-dynamodb aws-sdk

我有一个包含以下 KeySchema 的表:

KeySchema: [
{AttributeName: USER_ID,KeyType: HASH}, 
{AttributeName: COMPLETED,KeyType: RANGE}],
Run Code Online (Sandbox Code Playgroud)

用户 ID 只是一个整数,但COMPLETED它是创建记录时的时间戳。

我正在尝试使用以下代码检索记录:

Item item = tbl.getItem("USER_ID", "4216634082");
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

AmazonDynamoDBException: The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException...
Run Code Online (Sandbox Code Playgroud)

由于范围键是一个时间戳,所以在我找到记录之前我不知道它是什么。我如何实现这一目标?

bra*_*ter 6

您正在调用getItem,这是按其键查找项目 - 如果键架构定义了散列和范围组件,则这需要散列和范围组件。

如果要获取具有特定散列(按范围键排序)的所有项目,则需要使用查询。例如:

Table table = dynamoDB.getTable("YourTable");

QuerySpec spec = new QuerySpec()
    .withKeyConditionExpression("USER_ID = :user_id")
    .withValueMap(new ValueMap()
        .withString(":user_id", "4216634082"))

ItemCollection<QueryOutcome> items = table.query(spec);
Run Code Online (Sandbox Code Playgroud)

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html的概念和http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryingJavaDocumentAPI.html查看详细的Java SDK的文档。

(从文档链接中提取的示例)