繁体   English   中英

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

[英]With DynamoDb enhanced client from java aws sdk, how do you query using a compound keyConditionExpression?

我有一个 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();

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM