如何通过全局二级索引过滤golang中的dynamodb?

问题描述 投票:0回答:1

我在使用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。

amazon-web-services go amazon-dynamodb
1个回答
0
投票

使用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()}
© www.soinside.com 2019 - 2024. All rights reserved.