分页前的 DynamoDB 过滤

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

我正在向 DynamoDB 写入请求,其中我需要保证页面中的项目数量。我正在使用java,awssdk。这就是我的要求:

val keyEqual =
                sortBeginsWith(
                        key ->
                                key.partitionValue(source.getParrentEntityId())
                                        .sortValue(SOME_PREFIX.getValue() + "#"));
        val requestBuilder =
                QueryEnhancedRequest.builder()
                        .queryConditional(keyEqual)
                        .limit(source.getLimit())
                        .exclusiveStartKey(startKey);
        if (nonNull(source.getStatus())) {
            requestBuilder.filterExpression(
                    Expression.builder()
                            .expression("#status = :status")
                            .putExpressionName("#status", "st")
                            .putExpressionValue(
                                    ":status",
                                    AttributeValue.builder()
                                            .s(source.getStatus().toString())
                                            .build())
                            .build());
        }
        val pages = dynamoDbTable.query(requestBuilder.build());

我知道分页后应用过滤,并尝试使用扫描而不是查询,但我没有找到有关如何将 sk 和 pk 条件添加到扫描查询的信息。有人可以告诉我如何解决我的问题吗?

java database amazon-web-services amazon-dynamodb nosql
1个回答
0
投票

在 DynamoDB 中,您无法保证在过滤非关键属性时返回的项目数量。如果您的目标是保证一定数量的物品,您有两种选择:

  1. 确保您的项目与您的 KeyConditionExpression 匹配,以便您可以在不过滤的情况下阅读它们,这将准确返回您所要求的内容。

  2. 返回超出您需要的内容,然后限制客户端的结果以满足您的需求。

至于扫描,这也不适合您的用例,因为所有 API 的过滤方式都相同,过滤器在限制之后应用。

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