
在 DynamoDB 中,若表定义了复合主键(分区键 + 排序键),无法通过 GetItem 获取多个项目;必须改用 Query 操作,按分区键精确匹配并返回该键下全部相关记录。
在 dynamodb 中,若表定义了复合主键(分区键 + 排序键),无法通过 `getitem` 获取多个项目;必须改用 `query` 操作,按分区键精确匹配并返回该键下全部相关记录。
DynamoDB 的 GetItem API 仅适用于精确获取单个项(需同时提供完整的主键:分区键 + 排序键)。当你仅知道 DeviceId(分区键)而希望获取该设备下的所有历史记录(例如按不同 Time 值存储的多条数据)时,GetItem 会失败或仅返回一条(若碰巧指定排序键值),因此必须切换为 Query 操作。
Query 是专为高效检索同一分区键下所有项目的操作,它利用主键索引,性能远优于 Scan,且支持排序、分页和条件过滤。
以下是使用 AWS SDK for Go(v1)执行 Query 的标准写法:
使用 OpenAI Codex CLI 处理编码任务。触发词:codex、code review、fix CI、refactor code、implement feature、coding agent、gpt-5-codex。Clawdbot 可将编码工作委托给 Codex CLI 作为子代理或直接工具。
queryInput := &dynamodb.QueryInput{
TableName: aws.String("DbName"),
KeyConditionExpression: aws.String("DeviceId = :deviceId"),
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
":deviceId": {
S: aws.String("item_1"),
},
},
}
result, err := svc.Query(queryInput)
if err != nil {
log.Fatalf("Query failed: %v", err)
}
✅ 推荐写法说明:
- 使用 KeyConditionExpression(而非已弃用的 KeyConditions)——这是 SDK v1 后期版本及 v2 的标准方式;
- ExpressionAttributeValues 提供安全的参数化值绑定,防止表达式注入;
- 默认按排序键 Time 升序返回结果;如需降序,添加 ScanIndexForward: aws.Bool(false);
- 若结果超过 1MB 或项数较多,DynamoDB 自动截断,需检查 LastEvaluatedKey 并循环分页查询。
⚠️ 注意事项:
- Query 只能作用于主表或全局二级索引(GSI)的主键,不能跨分区键查询;
- 确保 DeviceId 类型与表定义一致(本例为 String),否则返回空结果且无报错;
- 避免误用 Scan:它遍历全表,成本高、延迟大、不随数据量扩展,仅当无合适分区键可用时才考虑。
总结:面对复合主键场景,牢记 —— “单行查 GetItem,单分区批量查 Query,全表查 Scan”。合理选择操作类型,是保障 DynamoDB 应用高性能与低成本的关键基础。










