如何在 DynamoDB 中基于 HashKey 和 range Key 进行查询



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

假设我的表是TestTable的,它的架构是这样的:

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

现在,如果我想根据此处Id hashKey查询此表,我们将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作为我的编程语言。

我前段时间写了一篇关于使用 AWS Java 开发工具包进行 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 对象持久性模型部分。

你可以使用 dynamoDbMapper.load() 如下:

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

如果您不使用索引,您应该有一个项目(如果有的话),其Id ="123"Date ="1234"

对于确切的哈希键和范围键(如果是运算符=),不需要查询操作。请在GetItem API上有一个战利品,这很漂亮。请参阅文档页面。

如果您需要非 EQ 运算符作为范围键(例如 >=),可以在Query操作中使用键条件表达式:Id = :id and Date >= :date

相关内容

  • 没有找到相关文章

最新更新