我正在向 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 条件添加到扫描查询的信息。有人可以告诉我如何解决我的问题吗?
在 DynamoDB 中,您无法保证在过滤非关键属性时返回的项目数量。如果您的目标是保证一定数量的物品,您有两种选择:
确保您的项目与您的 KeyConditionExpression 匹配,以便您可以在不过滤的情况下阅读它们,这将准确返回您所要求的内容。
返回超出您需要的内容,然后限制客户端的结果以满足您的需求。
至于扫描,这也不适合您的用例,因为所有 API 的过滤方式都相同,过滤器在限制之后应用。