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

Boto3 DynamoDb查询与选择计数没有分页

宋志学
2023-03-14

这更像是一个概念澄清。我可以使用Boto3通过使用上一个响应的LastEvaluatedKey重复查询找到实际计数。

我想计算符合dynamoDb中特定条件的项目。我使用的是“select=count”,根据文档[1],它应该只返回匹配项的计数,并且我假设响应不会分页。

计数-返回匹配项的数量,而不是匹配项本身。

当我通过AWS-cli尝试时,我的假设似乎是正确的(就像文档[1]中的其他api样本一样)

    aws dynamodb query \
    --table-name 'my-table' \
    --index-name 'classification-date-index' \
    --key-condition-expression 'classification = :col AND #dt BETWEEN :start AND :end' \
    --expression-attribute-values '{":col" : {"S":"INTERNAL"}, ":start" : {"S": "2020-04-10"}, ":end" : {"S": "2020-04-25"}}' \
    --expression-attribute-names '{"#dt" : "date"}' \
    --select 'COUNT'
 {
      "Count": 18817,
      "ScannedCount": 18817,
      "ConsumedCapacity": null
  }

但是当我尝试使用Python3和Boto3时,响应被分页,我必须重复查询,直到LastEvaluatedKey为空。

In [22]: table.query(IndexName='classification-date-index', Select='COUNT', KeyConditionExpression= Key('classification').eq('INTERNAL') & Key('date').between('2020-04-10', '2020-04-25'))

Out[22]:
{'Count': 5667,
 'ScannedCount': 5667,
 'LastEvaluatedKey': {'classification': 'INTERNAL',
  'date': '2020-04-14',
  's3Path': '<redacted>'},
 'ResponseMetadata': {'RequestId': 'TH3ILO0P47QB7GAU9M3M98BKJVVV4KQNSO5AEMVJF66Q9ASUAAJG',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'server': 'Server',
   'date': 'Sat, 25 Apr 2020 13:32:36 GMT',
   'content-type': 'application/x-amz-json-1.0',
   'content-length': '230',
   'connection': 'keep-alive',
   'x-amzn-requestid': 'TH3ILO0P47QB7GAU9M3M98BKJVVV4KQNSO5AEMVJF66Q9ASUAAJG',
   'x-amz-crc32': '133035383'},
  'RetryAttempts': 0}}

我期望boto3sdk会有与awscli一样的行为,因为响应似乎小于1mb。这些文件有点冲突。。。

“分页表查询结果”[2]页面显示:

DynamoDB对查询操作的结果进行分页。通过分页,查询结果被划分为大小为1MB(或更小)的数据“页面”。应用程序可以处理结果的第一页,然后是第二页,依此类推。单个查询仅返回符合1 MB大小限制的结果集。

而查询[1]页面显示:

单个查询操作将最多读取设置的最大项数(如果使用Limit参数)或最多1 MB的数据,然后使用FilterExpression对结果应用任何筛选。

[1]https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

[2] https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.Pagination.html

共有1个答案

戚良弼
2023-03-14

我自己就写了这个问题。AWS CLI对DynamoDB查询中的页面进行自动求和。要阻止它这样做,请将--no paginate添加到此页面上列出的命令中

 类似资料:
  • 问题内容: 我有一个Oracle表,其中包含一组范围(RangeA和RangeB)。这些列是varchar,因为它们可以同时容纳数字和字母数字值,如以下示例所示: 我需要执行一个查询,该查询仅返回具有数值的记录,并对该查询执行Count。到目前为止,我已经尝试过使用两个不同的查询来做到这一点,但没有任何运气: 查询1: 查询2: 子查询工作正常,因为我得到的两个记录都只有数字值,但是查询的COUN

  • 我想使用QueryDSL库构建select count查询,如下所示: 中选择计数(1) 我创建了下一个代码: 由于结果selectStatement是Next: 能否请一些人建议如何重写上面的代码

  • 问题内容: 我想结合两个查询 然后计算百分比(将第二个查询除以第一个查询)。我想在一个查询中实现这一目标。到目前为止我尝试过的是: 我得到的是: 我想要的是: 问题答案: 这应该给您您想要的: 编辑:没注意到这是为Access。我不知道Access中是否可用,因此您可能需要使用一个等效函数来确保整数不会简单地产生1或0。Access可能会自动将除法转换为小数,但在SQL Server则不然。

  • 问题内容: 我有一个关于MYSQL中的选择查询的问题 我有两个不同的表,我想获得一定的结果 我使用了COUNT方法,该方法只给我结果(> = 1) 但实际上,我想使用包含零的所有计数怎么做? 我的查询是: 第一张桌子:Content_hits 第二张表:Content_tag 结果但不完整 例如:tag_id = 1的Subsrciber6应该具有count(*)= 0 问题答案: 现在,您已经进

  • 问题内容: 我有三个表的简单文章应用程序: 在登录页面上,我想显示最新文章标题以及作者姓名和文章评论总数。主要问题是如何获取文章的评论总数,我没有弄对。我应该得到以下输出: 在我的实际应用程序中,我在文章表中添加了一个列,以显示对该文章的评论总数。当新注释添加到系统时,此列将更新。这样做的问题是,在添加新评论时,文章表被锁定了。在我的应用程序中,每分钟都会添加很多评论。因此,我试图避免通过重写SQ

  • 嗨,最近我一直在研究REST API。我在想,如果没有参数,我怎么才能得到所有的数据。我只能通过categoryId获得数据,如下所示。http://..../categorys?categoryID=2数据被选择并显示如下。