首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解开map[string]*dynamodb.AttributeValue?

如何解开map[string]*dynamodb.AttributeValue?
EN

Stack Overflow用户
提问于 2022-11-01 08:50:51
回答 1查看 74关注 0票数 2

我正在查询一个DynamoDB表,需要UnmarshalMap,即查询输出。表中的记录是JSON。

代码语言:javascript
运行
复制
[{"movie":"Joker","year":"2019"}]

或者类似的东西

代码语言:javascript
运行
复制
[{"movie":"Joker","year":"2019"}, {"movie":"Cruella","year":"2021"}]
代码语言:javascript
运行
复制
type Movies struct {
   Movie string `json:"movie" bson:"movie" dynamodbav:"movie"`   
   Year  string `json:"year" bson:"year" dynamodbav:"year"`   
}

type Database struct {
    User    string    `json:"user" bson:"user" dynamodbav:"user"`   
    List    []*Movies `json:"movies" bson:"movies" dynamodbav:"movies"`
    
}


listOfMovies = Database{}

if err := dynamodbattribute.UnmarshalMap(tableOutput.Item, &listOfMovies); err != nil {
        log.Println(err)
        return nil, err
    }
return listOfMovies.List, nil

tableOutput.Item是一张地图,包含数据库中的一条记录,我没有发现错误,但是电影列表是空的。我不明白我做错了什么。这是UnmarshalMap应该如何工作的吗?

EN

回答 1

Stack Overflow用户

发布于 2022-11-10 13:46:56

为了管理您的场景,我编写了一个简单的示例程序,向您简要介绍了编写和阅读过程。下面可以找到我的示例应用程序的代码:

代码语言:javascript
运行
复制
package main

import (
    "context"
    "encoding/json"
    "fmt"

    "dynamodbmovie/utils"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)

var cfg *aws.Config

func main() {
    cfg, _ = utils.GetAwsConfig()
    dynaClient := dynamodb.NewFromConfig(*cfg)

    // create table
    dynaClient.CreateTable(context.TODO(), &dynamodb.CreateTableInput{
        TableName: aws.String("movies"),
        AttributeDefinitions: []types.AttributeDefinition{
            {
                AttributeName: aws.String("user"),
                AttributeType: types.ScalarAttributeTypeS,
            },
        },
        KeySchema: []types.KeySchemaElement{
            {
                AttributeName: aws.String("user"),
                KeyType:       types.KeyTypeHash,
            },
        },
        BillingMode: types.BillingModePayPerRequest,
    })

    defer func() {
        dynaClient.DeleteTable(context.TODO(), &dynamodb.DeleteTableInput{
            TableName: aws.String("movies"),
        })
    }()

    // load table
    dynaClient.PutItem(context.TODO(), &dynamodb.PutItemInput{
        TableName: aws.String("movies"),
        Item: map[string]types.AttributeValue{
            "user":        &types.AttributeValueMemberS{Value: "user1"},
            "movies_list": &types.AttributeValueMemberS{Value: `[{"movie":"Joker","year":"2019"}, {"movie":"Cruella","year":"2021"}]`},
        },
    })

    // read table
    var filmString string
    res, _ := dynaClient.GetItem(context.TODO(), &dynamodb.GetItemInput{
        TableName: aws.String("movies"),
        Key: map[string]types.AttributeValue{
            "user": &types.AttributeValueMemberS{Value: "user1"},
        },
    })

    attributevalue.Unmarshal(res.Item["movies_list"], &filmString)
    myDb := &Database{
        User: "user1",
    }

    json.Unmarshal([]byte(filmString), &myDb.List)

    fmt.Println(len(myDb.List))
}

utils/models.go

代码语言:javascript
运行
复制
package main

type Movies struct {
    Movie string `json:"movie"`
    Year  string `json:"year"`
}

type Database struct {
    User string    `json:"user"`
    List []*Movies `json:"movies"`
}

正如您所看到的,除了json注释之外,不需要其他标记注释。为了满足您的需要,我将电影列表作为JSON字符串存储在DynamoDb中,因此您必须对一个简单的字符串进行封送/解封处理。然后,通过第二个解封送处理,您可以将信息带到Database结构上。

请注意,为了举例,我没有考虑错误管理和编写好软件的原则.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74273483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档