ScannedCount 小于记录总数并且结果在 dynamoDB 中为零

Abd*_*ala 5 amazon-dynamodb

我在 dynamoDB AWS 上遇到了一个奇怪的问题 - 我正在使用 AWS API Gateway - AWS 服务代理查询我的表,我得到 Count:0 结果,并且 ScannedCount 在总共 10000 条记录中大约有 2500 条记录。只是为了确认我在 dynamoDB 上使用扫描操作的表中有需要的数据。

我无法理解的是为什么 ScannedCount 小于完整的表记录。这是否会发生

Bor*_*rov 8

根据 DynamoDB文档ScannedCount是 dynamodb 为当前请求Count查看的项目数,是与您的过滤器匹配的项目数:

计算结果中的项目

除了符合您的条件的项目之外,查询响应还包含以下元素:

  • ScannedCount — 在应用过滤器表达式(如果存在)之前与关键条件表达式匹配的项目数。
  • Count — 应用过滤器表达式(如果存在)后剩余的项目数。**

笔记

如果不使用过滤器表达式,则 ScannedCount 和 Count 将具有相同的值。

如果 Query 结果集的大小大于 1 MB,则 ScannedCount 和 Count 将仅表示总项目的部分计数。您将需要执行多个查询操作以检索所有结果(请参阅对结果进行分页)

每个 Query 响应将包含由该特定 Query 请求处理的项目的 ScannedCount 和 Count。要获得所有 Query 请求的总计,您可以保持 ScannedCount 和 Count 的运行记录。

因此,在您的情况下,扫描通过了前 2500 条记录(ScannedCount 为 2500)并且没有与您的过滤器匹配的结果(Count 为零)。

要扫描在表中的数据的其余部分,你需要重复使用分页参数要求描述这里

单次扫描将仅返回符合 1 MB 大小限制的结果集。要确定是否有更多结果,并一次检索一页,应用程序应执行以下操作:

  • 检查低级扫描结果:
    • 如果结果包含 LastEvaluatedKey 元素,请继续执行步骤 2。
    • 如果结果中没有 LastEvaluatedKey,则没有更多的项目要检索。
  • 构造一个新的 Scan 请求,使用与前一个相同的参数——但这次,采用步骤 1 中的 LastEvaluatedKey 值,并将其用作新 Scan 请求中的 ExclusiveStartKey 参数。
  • 运行新的扫描请求。
  • 转到步骤 1。

根据语言的不同,您可以找到一个为您进行分页的库,例如用于 python 的boto2 高级 dynamodb 客户端或boto3 中的“分页器”