猿问

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

我有问题的代码(最小的可重现示例):


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))


慕神8447489
浏览 104回答 1
1回答

慕工程0101907

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)
随时随地看视频慕课网APP

相关分类

Go
我要回答