用 AWS CLI 执行 DynamoDB BatchGetItem

aws dynamodb batch-get-item 用一条命令按主键取回最多 100 个项目。在命令行上,有两点让它区别于 queryscan:键是嵌套的 DynamoDB JSON,你得先熬过 shell 的引号转义;而且 CLI 不会替你把 UnprocessedKeys 抽干。相关限制和部分结果的规则见 DynamoDB 批量操作

代码

aws dynamodb batch-get-item \
  --request-items '{
    "Music": {
      "Keys": [
        {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}},
        {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "A Mis Abuelos"}},
        {"Artist": {"S": "Ella Fitzgerald"}, "SongTitle": {"S": "Misty"}}
      ]
    }
  }'

删减之后,输出把每张表映射到找到的项目,外加任何剩余项。完整的原样运行记录在本页更靠下的位置:

{
    "Responses": {
        "Music": [
            {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}, ...}
        ]
    },
    "UnprocessedKeys": {}
}

说明

  • 这条命令在 CLI 里根本没有分页机制aws dynamodb query help 会列出 --starting-token--max-items--page-sizeaws dynamodb batch-get-item help 三个都不列。UnprocessedKeys 不是分页 token,CLI 把这次调用当成一次性的,所以抽干它靠的是你自己的 shell 循环,而不是某个参数。
  • 剩余项的映射本身就是输入格式。非空的 UnprocessedKeys 可以原封不动地重新喂给 --request-items,不需要任何改形,这也是 bash 里那个 while 循环还算能忍的原因。两次尝试之间要 sleep;立刻重跑会撞上同一个被限流的分区。
  • ProjectionExpressionConsistentRead 放在每张表自己的对象里,紧挨着 "Keys"。把它们放到 --request-items 的顶层,是这里最常见的结构错误。
  • 把这个映射放进文件里--request-items file://keys.json 彻底绕开 shell 引号转义,键一多它就是唯一理智的选项。它同时也是你在毫无察觉的情况下撞上 100 键上限的方式。

这条命令实际打印出什么

上面的代码块原样跑在 DynamoDB Local 3.3.0 上,三首歌都在(aws-cli/2.36.9):

{
    "Responses": {
        "Music": [
            {
                "Artist": {"S": "Arturo Sandoval"},
                "AlbumTitle": {"S": "Danzon"},
                "Year": {"N": "1994"},
                "SongTitle": {"S": "A Mis Abuelos"}
            },
            {
                "Artist": {"S": "Ella Fitzgerald"},
                "AlbumTitle": {"S": "Ella in Berlin"},
                "Year": {"N": "1960"},
                "SongTitle": {"S": "Misty"}
            },
            {
                "Artist": {"S": "Arturo Sandoval"},
                "AlbumTitle": {"S": "Danzon"},
                "Year": {"N": "1994"},
                "SongTitle": {"S": "Cubano Chant"}
            }
        ]
    },
    "UnprocessedKeys": {}
}

(每个属性映射被折叠成了一行;其余都是原样打印。)命令里第一个要的是 Cubano Chant,拿回来时它排在最后。响应里没有任何东西是按位置来的,所以一个用 .Responses.Music[0] 取下标的 jq 表达式,读到的是服务当时随手先返回的那个项目。改成按键属性过滤。

有两种请求它会直接拒绝,打到 stderr,退出状态为 254

aws: [ERROR]: An error occurred (ValidationException) when calling the BatchGetItem operation: Provided list of item keys contains duplicates
aws: [ERROR]: An error occurred (ValidationException) when calling the BatchGetItem operation: Too many items requested for the BatchGetItem call

aws: [ERROR]: 这个前缀是 CLI v2 的包装;它后面的文字才是服务自己的消息。如果重试循环把任何非零退出都当成限流,碰上这两个中的任何一个都会永远空转,所以在退避之前先按消息分支。

在单引号里手写那段嵌套 JSON,是大部分错误的来源。DynamoDB Expression Builder 会组装带类型的键映射并复制出一条可直接运行的命令,至少能把引号转义从嫌疑名单上划掉。

要读回一组键、直接看到项目而不绕这一圈 JSON,请下载 DynoTable

相关示例

参考资料

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

无需控制台即可使用 DynamoDB

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

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