amazon-web-services - 如何通过全局二级索引过滤golang中的dynamodb?
问题描述
我在使用 Go 过滤 dynamodb 表时遇到问题。
该表具有以下结构:
input := &dynamodb.CreateTableInput{
BillingMode: aws.String("PAY_..."),
AttributeDefinitions: []*dynamodb.AttributeDefinition{
{
AttributeName: aws.String("Id"),
AttributeType: aws.String("N"),
},
{
AttributeName: aws.String("Token"),
AttributeType: aws.String("S"),
},
},
KeySchema: []*dynamodb.KeySchemaElement{
{
AttributeName: aws.String("Id"),
KeyType: aws.String("HASH"),
},
},
GlobalSecondaryIndexes: []*dynamodb.GlobalSecondaryIndex{
{
IndexName: aws.String("IdxGS"),
KeySchema: []*dynamodb.KeySchemaElement{
{
AttributeName: aws.String("Token"),
KeyType: aws.String("HASH"),
},
},
Projection: &dynamodb.Projection{
ProjectionType: aws.String("ALL"),
},
},
},
TableName: aws.String("Entity"),
}
我尝试了不同的方法来过滤它:
第一个选项:
queryInput := &dynamodb.QueryInput{
TableName: aws.String("Entity"),
IndexName: aws.String("IdxGS"),
KeyConditionExpression: "Token = :token",
ExpressionAttributeValues: {
":token": token,
},
ProjectionExpression: "Id, Token"}
resp, err := DynamoDbClient.Query(queryInput)
而且这段...代码不可编译,不知道为什么。
还尝试使用另一种类型的输入请求:选项 2:
var queryInput = &dynamodb.QueryInput{
TableName: aws.String("Entity"),
IndexName: aws.String("IdxGS"),
KeyConditions: map[string]*dynamodb.Condition{
"TokenGS": {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String(token),
},
},
},
},
}
虽然它是可编译的,但它没有通过测试。
我检查了许多不同的示例,它们要么不起作用,要么不使用 GlobalSecondaryIndex。
解决方案
使用https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/expression包更容易,它负责正确设置所有QueryInput
属性。
此外,对于使用示例,您可以查看此存储库https://github.com/zshamrock/dynocsv/blob/master/aws/dynamodb/dynamodb.go#L253。
因此,在您的情况下,这可能如下所示:
hash := expression.KeyEqual(expression.Key("Token"), expression.Value(token))
expr, _ := expression.NewBuilder().
WithKeyCondition(hash).
WithProjection(expression.NamesList(expression.Name("Id"), expression.Name("Token"))).
Build()
queryInput := &dynamodb.QueryInput{
TableName: aws.String("Entity"),
IndexName: aws.String("IdxGS"),
KeyConditionExpression: expr.KeyCondition(),
ExpressionAttributeValues: expr.Values(),
ProjectionExpression: expr.Projection()}
推荐阅读
- reactjs - 将 Typescript 与 Material-UI useStyles 一起使用时将道具传递给类
- sql-server - 由于常量 varchar 列,架构绑定视图索引创建失败
- authentication - 使用随机字符串作为令牌而不是 JWT 进行身份验证
- email - 如何将 CNAME 记录添加到 Google 域?
- vue.js - vue.js 中有哪些替代方法可以将数据传递给除 props 之外的子组件
- javascript - 在 Deno 程序 API 上创建的 .deno_plugins 文件夹
- vue.js - 列出来自转换的一系列消息
- linux - 如何通过终端杀死bash中的进程
- reactjs - 在同一事件处理程序中更新多个 React 状态
- firebase - React Native:应用程序在后台时的应用程序内消息