为了账号安全,请及时绑定邮箱和手机立即绑定

键包含点时是否可以设置映射?

键包含点时是否可以设置映射?

Go
慕神8447489 2022-05-23 17:31:36
我有问题的代码(最小的可重现示例):import (    "fmt"    "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/expression")const (    tableName = "myTable")var (    sess = session.Must(session.NewSession())    dynamodbClient = dynamodb.New(sess))func main() {    update := expression.Set(        expression.Name("mymap.vitaly.zdanevich"),        expression.Value(true),    )    expr, _ := expression.NewBuilder().WithUpdate(update).Build()    updateItemInput := dynamodb.UpdateItemInput{        TableName: aws.String(tableName),        Key: map[string]*dynamodb.AttributeValue{            "pk": {                S: aws.String("test"),            },        },        UpdateExpression:          expr.Update(),        ExpressionAttributeNames:  expr.Names(),        ExpressionAttributeValues: expr.Values(),    }    fmt.Printf("%#v\n", updateItemInput)    dynamodbClient.UpdateItem(&updateItemInput)}结果更新项目输入:{  ExpressionAttributeNames: {    #0: "mymap",    #1: "vitaly",    #2: "zdanevich"  },  ExpressionAttributeValues: {    :0: {      BOOL: true    }  },  Key: {    pk: {      S: "test"    },    sk: {      S: "test"    }  },  TableName: "myTable",  UpdateExpression: "SET #0.#1.#2 = :0\n"}是的,我知道 dot 用于访问内部地图值,但在这种情况下最好的策略是什么?我目前的解决方案:expression.Name("mymap."+strings.Replace(username, ".", "_", -1))
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

AWS 可以选择使用表达式属性名称 ( Ref ) 来处理这种情况。但是在 aws go 库中,Expression BuilderExpressionAttributeNames通过Name按点和第三个括号拆分来创建。您可以尝试不使用表达式生成器。


    updateItemInput := dynamodb.UpdateItemInput{

        TableName: aws.String(tableName),

        Key: map[string]*dynamodb.AttributeValue{

            "pk": {

                S: aws.String("test"),

            },

        },

        UpdateExpression:          aws.String("SET #0.#1 = :0"),

        ExpressionAttributeNames:  map[string]*string {

            "#0": aws.String("mymap"),

            "#1": aws.String("vitaly.zdanevich"),

          },

        ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{

            ":0": {

                BOOL: aws.Bool(true),

            },

        },

    }

    fmt.Printf("%#v\n", updateItemInput)


    dynamodbClient.UpdateItem(&updateItemInput)


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信