
在 DynamoDB 中,若表存在复合主键(分区键 + 排序键),仅凭分区键获取多条记录必须使用 Query 操作而非 GetItem;后者仅支持精确匹配完整主键,返回单条记录。
在 dynamodb 中,若表存在复合主键(分区键 + 排序键),仅凭分区键获取多条记录必须使用 `query` 操作而非 `getitem`;后者仅支持精确匹配完整主键,返回单条记录。
DynamoDB 的 GetItem 操作设计用于根据完整主键(即分区键 + 排序键)精确获取单个项。当您的表结构为:
- 分区键(Partition Key):DeviceId(String)
- 排序键(Sort Key):Time(Number)
则 GetItem 无法满足“获取某 DeviceId 下所有记录”的需求——因为缺少 Time 值,无法构成唯一主键。此时,正确且高效的方式是使用 Query 操作,它专为基于分区键范围检索而设计,支持在指定分区键值下扫描所有匹配的排序键项。
✅ 正确用法:使用 Query 获取指定 DeviceId 的全部记录
以下为 Go 语言中使用 aws-sdk-go-v1(推荐升级至 v2,但逻辑一致)的完整示例:
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)
// 初始化 DynamoDB 客户端(略去 session 配置)
svc := dynamodb.New(session.Must(session.NewSession()))
queryInput := &dynamodb.QueryInput{
TableName: aws.String("DbName"),
KeyConditionExpression: aws.String("DeviceId = :deviceId"),
ExpressionAttributeNames: map[string]*string{
"#device": aws.String("DeviceId"),
},
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
":deviceId": {
S: aws.String("item_1"), // 替换为目标 DeviceId
},
},
}
result, err := svc.Query(queryInput)
if err != nil {
log.Fatalf("Query failed: %v", err)
}
// 解析响应结果
var items []map[string]interface{}
err = dynamodbattribute.UnmarshalListOfMaps(result.Items, &items)
if err != nil {
log.Fatalf("Unmarshal failed: %v", err)
}
fmt.Printf("Found %d items for DeviceId='item_1'\n", len(items))? 关键说明:
- KeyConditionExpression 是现代推荐写法(替代已弃用的 KeyConditions),更安全、支持表达式变量;
- ExpressionAttributeNames 用于避免保留字冲突(如字段名为 Type 或 Time 时);
- ExpressionAttributeValues 提供参数化值,防止注入并提升可读性;
- Query 默认按排序键升序返回,可通过 ScanIndexForward: aws.Bool(false) 反转顺序。
⚠️ 注意事项
- Query 要求必须指定分区键(DeviceId),排序键条件为可选(如 Time BETWEEN :t1 AND :t2);
- 若未定义全局二级索引(GSI),Query 只能作用于主表或本地二级索引(LSI);
- 单次 Query 最多返回 1MB 数据,若结果集较大,需通过 LastEvaluatedKey 分页处理;
- Scan 虽也能实现类似效果,但会遍历全表,成本高、性能差,严禁在生产环境对大表使用 Scan 替代 Query。
✅ 总结
| 操作 | 适用场景 | 主键要求 | 返回结果 |
|---|---|---|---|
| GetItem | 获取单个确定项 | 必须提供完整主键(PK+SK) | 0 或 1 条记录 |
| Query | 获取某分区键下所有/部分项(推荐) | 必须提供 PK,SK 可选 | 0~N 条有序记录 |
| Scan | 全表模糊匹配(不推荐) | 无需主键 | 全表过滤结果(低效) |
始终优先设计 Query 可达的数据访问模式——这是 DynamoDB 高性能与低成本的核心实践。

















