我在 dynamoDB AWS 上遇到了一个奇怪的问题 - 我正在使用 AWS API Gateway - AWS 服务代理查询我的表,我得到 Count:0 结果,并且 ScannedCount 在总共 10000 条记录中大约有 2500 条记录。只是为了确认我在 dynamoDB 上使用扫描操作的表中有需要的数据。
我无法理解的是为什么 ScannedCount 小于完整的表记录。这是否会发生
根据 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 中的“分页器”。