DynamoDB — cannot specify projection when Select is COUNT

TL;DR — 你的 Query/Scan 设置了 Select: COUNT 和一个 ProjectionExpression(或旧的 AttributesToGet)。COUNT 只返回匹配项目的数量,从不返回项目本身,因此指定要返回的属性是自相矛盾的——DynamoDB 会拒绝它。二选一:不带投影的 Select: COUNT,或者带 Select: SPECIFIC_ATTRIBUTES 的投影(当你提供 ProjectionExpression 时的默认值)。

含义

ValidationException: 1 validation error detected: Cannot specify the AttributesToGet when choosing to get only the Count

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: 1 validation error detected: Cannot specify the ProjectionExpression when choosing to get only the Count

(这是使用旧的 AttributesToGet 参数时的消息;使用 ProjectionExpression 时措辞不同,但规则相同。)Select 控制一次读取返回什么。COUNT 向 DynamoDB 请求一个计数(Count/ScannedCount)而没有项目数据。ProjectionExpression/AttributesToGet 请求返回项目的特定属性。这两者互斥——Query API 参考写得很清楚:"如果你使用 ProjectionExpression 参数,那么 Select 的值只能是 SPECIFIC_ATTRIBUTESSelect 的任何其他值都会返回一个错误。" 一个成本提示:COUNT 仍然消耗与实际获取项目相同的读取容量——它节省带宽,而不是 RCU。

为什么会发生

  • 两个参数同时设置——添加了 ProjectionExpression 却把 Select: COUNT 留在原处(或反之)。
  • 旧的 AttributesToGetSelect: COUNT 组合。
  • 一个查询构建器总是附加一个投影,即便调用方只想要一个计数。
  • 误解 Select——期望 COUNT 也把它计数的项目交回来。

如何修复

  1. 只是计数?去掉投影。 设置 Select: COUNT 并移除 ProjectionExpression/AttributesToGet
  2. 需要特定属性?去掉 Select: COUNT 提供一个 ProjectionExpression;DynamoDB 默认把 Select 设为 SPECIFIC_ATTRIBUTES,因此你通常根本不用设置 Select
  3. 既需要计数又需要项目? 为项目做一次调用(带你的投影)并读取它的 Count,或者做一次单独的 Select: COUNT 调用。
  4. 优先使用 ProjectionExpression 而非 AttributesToGet——AWS 把 AttributesToGet 标记为旧参数,并推荐改用 ProjectionExpression

只是想在探索时快速计数或查看一个投影视图?DynoTable 桌面应用会运行查询并显示匹配的计数,无需你手工拼装相互冲突的 Select 参数。

在 DynoTable 中打开

DynoTable 的查询面板将计数模式与投影分开 - 你可以获取具有选定属性的项目或读取匹配的计数,而绝不会在一个冲突的请求中同时执行这两种操作。使用⌘K打开一个表,运行Query,然后在状态栏中检查结果计数,而不附加ProjectionExpression。使用 Query Builder 为你的 SDK 代码生成仅投影或仅计数请求。使用 ⌘P 切换配置文件;在“设置”→“配置文件”下使用“Test Connection”配置它们。参见连接 AWS安装

来源

相关错误

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。