如何在HashKey和range Key的基础上在DynamoDB中进行查询?

时间:2015-06-15 08:01:13

标签: java amazon-dynamodb

我是DynamoDb新手。我只想知道如何使用hashKeyrangeKey在DynamoDB中查询表。

我们说我的表格是TestTable,它的架构是这样的:

1.Id (HK of type String)
2 Date (RK of type String )
3 Name (attribute of type String)

现在,如果我想在此hashKey Id的基础上查询此表格,我们将query设为:

让我们说我的查询是让所有项目都有Id ="123".

TestTable testTable = new TestTable();
testTable.setId("123");

DynamoDBQueryExpression<TestTable> queryExpression = new DynamoDBQueryExpression<TestTable>()
                                                                .withHashKeyValues(TestTable)
                                                                .withConsistentRead(false);

现在我希望所有项目都有Id ="123" and Date ="1234"

如何在DynamoDB

中查询此内容

我使用java作为我的编程语言。

3 个答案:

答案 0 :(得分:7)

我前段时间使用AWS Java SDK编写了一篇关于DynamoDB查询和索引的文章: http://labs.journwe.com/2013/12/15/dynamodb-secondary-indexes/

在你的情况下,它应该像这样工作(见http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaQueryScanORMModelExample.html):

AmazonDynamoDBClient client = new AmazonDynamoDBClient(new ProfileCredentialsProvider());
DynamoDBMapper mapper = new DynamoDBMapper(client);

String hashKey = "123";
long twoWeeksAgoMilli = (new Date()).getTime() - (15L*24L*60L*60L*1000L);
Date twoWeeksAgo = new Date();
twoWeeksAgo.setTime(twoWeeksAgoMilli);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String twoWeeksAgoStr = dateFormatter.format(twoWeeksAgo);            
Condition rangeKeyCondition = new Condition()
        .withComparisonOperator(ComparisonOperator.GT.toString())
        .withAttributeValueList(new AttributeValue().withS(twoWeeksAgoStr.toString()));

Reply replyKey = new Reply();
replyKey.setId(hashKey);

DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>()
        .withHashKeyValues(replyKey)
        .withRangeKeyCondition("ReplyDateTime", rangeKeyCondition);

List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);

查看DynamoDB文档的Java Object Persistence Model部分以获取更多信息。

答案 1 :(得分:6)

您可以使用dynamoDbMapper.load(),如下所示:

TestTable testTable = new TestTable();
testTable.setId("123");
testTable.setDate("1234");
TestTable result = dynamoDBMapper.load(testTable);

答案 2 :(得分:3)

如果您没有使用索引,那么您应该拥有Id ="123"Date ="1234"的确切项目(如果有)。

对于确切的散列键和范围键(在=运算符的情况下),您不需要查询操作。请在GetItem API处获得战利品,这是非常好的。请参阅documentation page

如果您需要范围密钥的非EQ运算符(例如>=),则可以在Query操作中使用key condition expressionId = :id and Date >= :date