与DynamoDb增强客户端从java aws sdk,你如何查询使用复合keyConditionExpression?



我有一个DynamoDb表,GSI超过两个键-字符串字段'id'(分区键)和数字字段'count'(排序键)。

我试图找出如何运行查询(不扫描)通过一个Spring Java应用程序使用dynamodbenhandedclient在这个表上的SDK的关键条件表达式:

#id = :idValue and #count between :minCount and :maxCount

我可以为这个复合表达式的每个部分构建两个单独的QueryConditional对象,例如:

var partitionKeyConditional = QueryConditional.keyEqualTo(Key.builder()
.partitionValue("myIdValue")
.build());
var sortKeyConditional = QueryConditional.sortBetween(Key.builder()
.sortValue(0)
.build(), Key.builder()
.sortValue(100)
.build());

但是我不知道如何在实际的查询请求中组合这些:

dynamoDbEnhancedClient.table(myTableName, TableSchema.fromBean(TableObject.class)) 
.query(QueryEnhancedRequest.builder()
.queryConditional(SomeJoinFunction??(partitionKeyConditional, sortKeyConditional))
.build())
.items();

我可以看到我可以使用filterExpression,但我假设这将在查询中应用键条件以选择结果之后发生,因此排序键定义的优势基本上失去了。它最接近于我想要的功能:

var expressionAttributeNames = new HashMap<String, String>() {{
put("#id", ID_PROPERTY_NAME);
put("#count", COUNT_PROPERTY_NAME);
}};
var expressionAttributeValues = new HashMap<String, AttributeValue>() {{
put(":idValue", AttributeValue.builder().s("myId").build());
put(":minCount", AttributeValue.builder().n("0").build());
put(":maxCount", AttributeValue.builder().n("100").build());
}};
var queryExpression = Expression.builder()
.expressionNames(expressionAttributeNames)
.expressionValues(expressionAttributeValues)
.expression("#id = :idValue and #count between :minCount and :maxCount")
.build();

我可能错过了一些明显的,有什么建议吗?

QueryConditionals使用的Key Builder可以同时取partitionKeysortKey值来构建其表达式。因此,当您构建QueryConditional.sortBetween对象时,您可以在那里定义匹配的partitionKey:

var partitionKeyValue = "myIdValue"
var sortKeyConditional = QueryConditional.sortBetween(Key.builder()
.partitionValue(partitionKeyValue)
.sortValue(0)
.build(), Key.builder()
.partitionValue(partitionKeyValue)
.sortValue(100)
.build());

最新更新