在 Golang 中查询 DynamoDB 的二级索引
Query a Secondary Index on DynamoDB in Golang
我的主键是一个名为 "id"
的字段
我在字段 "group_number"
上为我的 table 添加了二级索引
我是这样通过二级索引查询的:
// Query the secondary index
queryInput := &dynamodb.QueryInput{
TableName: aws.String(c.GetDynamoDBTableName()),
KeyConditions: map[string]*dynamodb.Condition{
"group_number": {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String(c.GroupNumber),
},
},
},
},
}
但是;我收到错误 "validationexception: query condition missed key schema element: id"
DynamoDB是否只允许查询主键?
我的印象是您使用 "GetItem" 作为主键,因为如果您使用主键,则只有一条记录可以返回。要通过二级索引进行搜索,您可以使用 "Query",而要通过非索引键进行搜索,您可以使用 "Scan".
请让我知道我在这里做错了什么。
除了TableName,创建查询索引的QueryInput时还需要指定IndexName
属性
https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/#QueryInput
// The name of an index to query. This index can be any local secondary index
// or global secondary index on the table. Note that if you use the IndexName
// parameter, you must also provide TableName.
IndexName *string `min:"3" type:"string"`
var queryInput, err2 = svc.Query(&dynamodb.QueryInput{
TableName: aws.String(tableName),
IndexName: aws.String(index_name),
KeyConditions: map[string]*dynamodb.Condition{
"Phone": {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String(phone_no),
},
},
},
},
})
我的主键是一个名为 "id"
的字段我在字段 "group_number"
上为我的 table 添加了二级索引我是这样通过二级索引查询的:
// Query the secondary index
queryInput := &dynamodb.QueryInput{
TableName: aws.String(c.GetDynamoDBTableName()),
KeyConditions: map[string]*dynamodb.Condition{
"group_number": {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String(c.GroupNumber),
},
},
},
},
}
但是;我收到错误 "validationexception: query condition missed key schema element: id"
DynamoDB是否只允许查询主键? 我的印象是您使用 "GetItem" 作为主键,因为如果您使用主键,则只有一条记录可以返回。要通过二级索引进行搜索,您可以使用 "Query",而要通过非索引键进行搜索,您可以使用 "Scan".
请让我知道我在这里做错了什么。
除了TableName,创建查询索引的QueryInput时还需要指定IndexName
属性
https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/#QueryInput
// The name of an index to query. This index can be any local secondary index
// or global secondary index on the table. Note that if you use the IndexName
// parameter, you must also provide TableName.
IndexName *string `min:"3" type:"string"`
var queryInput, err2 = svc.Query(&dynamodb.QueryInput{
TableName: aws.String(tableName),
IndexName: aws.String(index_name),
KeyConditions: map[string]*dynamodb.Condition{
"Phone": {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String(phone_no),
},
},
},
},
})