我有一个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可以同时取partitionKey
和sortKey
值来构建其表达式。因此,当您构建QueryConditional.sortBetween
对象时,您可以在那里定义匹配的partitionKey
:
var partitionKeyValue = "myIdValue"
var sortKeyConditional = QueryConditional.sortBetween(Key.builder()
.partitionValue(partitionKeyValue)
.sortValue(0)
.build(), Key.builder()
.partitionValue(partitionKeyValue)
.sortValue(100)
.build());