如何使用Java设置DynamoDB返回的匹配项的限制?

如何使用Java设置DynamoDB返回的匹配项的限制?,java,android,response,limit,amazon-dynamodb,Java,Android,Response,Limit,Amazon Dynamodb,在我的Android应用程序中,我想从DynamoDB查询数据。将有一千个匹配的项目,但我只想得到其中的前10个。我不知道如何设置这个限制。我在文档中找到以下行: DynamoDB查询和扫描api允许一个限制值来限制结果的大小 在请求中,将Limit参数设置为希望DynamoDB在返回结果之前处理的项目数 在响应中,DynamoDB返回限制值范围内的所有匹配结果。例如,如果发出限制值为6且没有筛选器表达式的查询或扫描请求,DynamoDB将返回表中与请求中指定的键条件匹配的前六项(或者在没有筛选

在我的Android应用程序中,我想从DynamoDB查询数据。将有一千个匹配的项目,但我只想得到其中的前10个。我不知道如何设置这个限制。我在文档中找到以下行:

DynamoDB查询和扫描api允许一个限制值来限制结果的大小

在请求中,将Limit参数设置为希望DynamoDB在返回结果之前处理的项目数

在响应中,DynamoDB返回限制值范围内的所有匹配结果。例如,如果发出限制值为6且没有筛选器表达式的查询或扫描请求,DynamoDB将返回表中与请求中指定的键条件匹配的前六项(或者在没有筛选器的扫描情况下仅返回前六项)。如果还提供FilterExpression值,DynamoDB将返回前六个中也符合筛选要求的项(返回的结果数将小于或等于6)。

但我找不到方法来限制回应。我找到了QueryResult的方法SetCount:

QueryResult result2 = dynamodb.query(request);
    result2.setCount(5);
它说:then Count是应用过滤器后返回的项目数


但我认为这不是我想要的。因为DynamoDb在调用setCount之前仍然返回所有匹配项。有人能帮我吗?

您需要在发送给API的请求中应用限制,而不是在响应中

我假设您提交给dynamodb对象的请求对象是一个。您需要做的是,在对API运行查询之前,调用传递您希望应用的限制

但是,正如您在问题中提到的,您需要确保了解DynamoDB文档中描述的限制行为:

在响应中,DynamoDB返回 限制值的范围。例如,如果发出查询或扫描 限制值为6且没有筛选器表达式的请求, DynamoDB返回表中与 请求中指定的关键条件(或仅前六项) 在无过滤器的扫描情况下)。如果您还提供 FilterExpression值,DynamoDB将在第一个 六个也符合筛选要求(结果数量 返回的值将小于或等于6)

这意味着,如果您不使用FilterExpression,您可能会没事。但是,如果您正在筛选结果,您可能会收到少于限制的结果,因为限制在技术上不是要返回的结果数,而是DynamoDB可能返回的项目数


听起来像是在寻求一种方法,让DynamoDB在应用FilterExpression时将返回的结果数限制为一个精确的数字。不幸的是,这在DynamoDB中目前是不可能的。

这就是使用aws java sdk 1.10.61版限制查询结果的方法

import com.amazonaws.AmazonClientException;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.QueryOutcome;
import com.amazonaws.services.dynamodbv2.document.spec.QuerySpec; 



AWSCredentialsProvider provider = new DefaultAWSCredentialsProviderChain();
AmazonDynamoDBAsyncClient client = new AmazonDynamoDBAsyncClient(provider);
Region region = Region.getRegion(Regions.fromName(DYNAMODB_REGION));
client.setRegion(region);
dynamoDB = new DynamoDB(client);

QuerySpec querySpec = new QuerySpec();

/* MAX 1 item */
querySpec.setMaxResultSize(1);

querySpec.withHashKey("myPartitionKeyName", partitionKeyValue);

ItemCollection<QueryOutcome> query = dynamoDB.getTable(DYNAMODB_TABLE).query(querySpec);
import com.amazonaws.AmazonClientException;
导入com.amazonaws.auth.AWSCredentialsProvider;
导入com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
导入com.amazonaws.regions.Region;
导入com.amazonaws.regions.regions;
导入com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient;
导入com.amazonaws.services.dynamodbv2.document.DynamoDB;
导入com.amazonaws.services.dynamodbv2.document.Item;
导入com.amazonaws.services.dynamodbv2.document.ItemCollection;
导入com.amazonaws.services.dynamodbv2.document.queryyoutcome;
导入com.amazonaws.services.dynamodbv2.document.spec.QuerySpec;
AWSCredentialsProvider=新的默认AWSCredentialsProviderChain();
AmazonDynamoDBAsyncClient=新的AmazonDynamoDBAsyncClient(提供者);
Region Region=Region.getRegion(Regions.fromName(DYNAMODB_Region));
client.setRegion(region);
dynamoDB=新的dynamoDB(客户);
QuerySpec QuerySpec=新QuerySpec();
/*最多1项*/
querySpec.setMaxResultSize(1);
querySpec.withHashKey(“myPartitionKeyName”,partitionKeyValue);
ItemCollection query=dynamoDB.getTable(dynamoDB_表).query(querySpec);

这就是使用java限制来自dynamodb的数据的方法

ItemCollection<ScanOutcome> collection = null;

try {
    
    DynamoDB dynamoDB = DynamoDBClientUtil
           .getDynamoDBClient(accessKeyId, secretAccessKey, arnRole);          
    
    Table table = dynamoDB.getTable(tableName);
    ScanSpec specification = new ScanSpec();        
    specification.setMaxResultSize(10);             
    collection = table.scan(specification);

} catch (Exception ex) {
    log.error(ex.getMessage());
}

return collection;
ItemCollection=null;
试一试{
DynamoDB DynamoDB=DynamoDB客户端
.getDynamoDBClient(accessKeyId、secretAccessKey、arnRole);
Table Table=dynamoDB.getTable(tableName);
ScanSpec规范=新的ScanSpec();
规格:setMaxResultSize(10);
收集=表格扫描(规格);
}捕获(例外情况除外){
log.error(例如getMessage());
}
回收;

您需要使用AWS SDK,我想@Nambari您能给我提供更多信息吗?我没有在你的链接中看到限制条款。@Nambari谢谢你的链接,但这不是我想要的。我想知道退货匹配物品的数量。非常感谢。我理解。目前我想使用DynamoDBQueryExpression和DynamoDBMapper来获取项目。但是DynamoDBQueryExpression的setLimit(integer)方法不起作用。例如,如果我调用setLimit(10),它仍然返回所有50个匹配项。我认为setLimit不是正确的方法,您应该能够调用QuerySpec上的withMaxResultSize来指定限制,以便将其作为请求的一部分应用。如果它仍然无法工作,则添加一个代码片段可能有助于澄清请注意,在调用DynamoDBMapper.query时,如果需要检索整个结果集,会向DynamoDB发出多个请求。设置此选项将限制每个请求检索的项目数,而不是将检索的结果总数。使用DynamoDBMapper.queryPage从DynamoDB检索一页项目。“注意:
MaxResultS