当前位置: 首页 > 知识库问答 >
问题:

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

公冶翰池
2023-03-14

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

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

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

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

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

QueryResult result2 = dynamodb.query(request);
    result2.setCount(5);

它说:then Count是应用过滤器后返回的项目数

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

共有3个答案

艾文斌
2023-03-14

这就是使用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;
微生令
2023-03-14

这就是使用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);
阴凯歌
2023-03-14

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

我假设您提交给Dynamodb对象的请求对象是QuerySpec。您要做的是调用MaxResultsize,在对API运行查询之前传入您想要应用的限制。

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

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

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

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

 类似资料:
  • 因此,我正在对最新的DynamoDBEnhancedAsyncClient使用分页。 然而,在上应用限制()时,它并没有限制单个页面上的项目。示例:如果我通过仍然在中显示2条记录。不确定是以项目数为参数还是以页数为参数。如果是它的页面,有没有办法限制每页的数量?我们知道DDB创建的页面最大大小为1MB。但我们的json记录以字节为单位,这意味着每页将获取的记录。这不是效率低下吗?是否可以限制每页的

  • 我尝试进入调试模式,它似乎无法提取字符串的特定部分。我做错了什么?我的regex错了吗?它似乎与我尝试过的所有在线regex构建器/测试器相匹配。

  • 我有一个要求,在Dynamodb中查询表时只需要返回一行。我可以在aws cli中看到一个名为“max items”的参数,它显然限制了查询的结果大小。以下是示例查询: 但我无法在Go中找到任何类似的关键字/属性。 以下是我可以找到的相关内容:如何使用Java设置DynamoDB返回的匹配项的限制?

  • 问题内容: 我想获取两个列表并查找两个列表中都出现的值。 [5]例如,将返回。 问题答案: 使用,它快速且可读。

  • 我在用node.js. 如果你看这个例子: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html 上面写着: 其中限制结果项的数量: 通常,AWS CLI自动处理分页;然而,在本例中,CLI的--page size参数限制了每页的项目数。 但如果您读取节点。js AWS文件: https://docs.