使用来自 java aws sdk 的 DynamoDb 增强客户端,如何使用复合 keyConditionExpression 进行查询?

问题描述 投票:0回答:2

我有一个 DynamoDb 表,其中包含两个键的 GSI - 字符串字段“id”(分区键)和数字字段“count”(排序键)。

我正在尝试弄清楚如何使用此表上 SDK 中的 DynamoDbEnhancedClient 作为关键条件表达式,通过 Spring Java 应用程序运行查询(而不是扫描):

#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();

我可能遗漏了一些明显的东西,有什么建议吗?

java amazon-dynamodb aws-sdk dynamodb-queries
2个回答
10
投票

QueryConditionals
使用的密钥构建器可以采用
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());

0
投票

由于低代表,我无法对@renato-costa 答案发表评论。

另外,如果排序键是数字,

greaterThan
lessThan
QueryConditional
如何使用?

var partitionKey = "abc";
var eventTime = 1727307974000 // epoch millis

var partitionKeyConditional = QueryConditional.keyEqualTo(Key.builder()
      .partitionValue(partitionKey)
      .build());

var sortKeyConditional = QueryConditional.sortGreaterThan(Key.builder()
      .sortValue(eventTime)
      .build());

如何将它们放入

queryConditional

© www.soinside.com 2019 - 2024. All rights reserved.