Rumah > Artikel > pembangunan bahagian belakang > Cara mengemas kini hanya satu medan dalam DynamoDB menggunakan AWS Go SDK
Semoga seseorang dapat memberi sedikit pencerahan tentang isu yang saya hadapi ini.
Saya ada meja ini dalam dinamo, jom panggil people
,在这个表中,我有 id
的属性作为我们的分区键、name
、lastname
和 status
.
Saya mahu dapat mengemas kini hanya satu harta atau menyimpan semua sifat id.
Sekarang, ini adalah cara saya melakukannya. Saya mencipta struktur berikut:
type personupdate struct { firstname string `json:"firstname,omitempty"` lastname string `json:"lastname,omitempty"` status string `json:"status,omitempty"` }
Permintaan daripada pelayan hanya mengemas kini nama keluarga orang itu, jadi badan permintaan kami akan kelihatan seperti ini:
{ "lastname": "bob" }
Selepas mengikat permintaan pada struktur, objek yang akan dihantar ke dinamo akan kelihatan seperti ini:
{ "firstname": "", "lastname": "bob", "status": "", }
Sekarang, seperti yang anda lihat, apabila tiba masanya untuk menulis kepada dynamo, hanya satu sifat perlu dikemas kini dan selebihnya sifat kosong/kosong harus diabaikan.
Kod yang ditulis untuk melakukan ini boleh dipekatkan kepada yang berikut:
// marshal our object _, err := dynamodbattribute.marshalmap(person) if err != nil{ fmt.println("some error marshaling") } // create our update input input := &dynamodb.updateiteminput{ key: map[string]*dynamodb.attributevalue{ "id":{ s: aws.string("1234"), }, }, tablename: aws.string("people"), expressionattributevalues: map[string]*dynamodb.attributevalue{ ":fn": { s: aws.string(person.firstname), }, ":ln":{ s: aws.string(person.lastname), }, ":st":{ s: aws.string(person.status), }, }, updateexpression: aws.string("set firstname = :fn, lastname = :ln, status = :st"), returnvalues: aws.string("updated_new"), } // send update request to dynamo _, err := service.updateitem(input)
Kini, tiada masalah dengan mengemas kini, masalahnya ialah bendera firstname
和 status
的 null 值也被传递。我尝试过阅读他们的文档,但还是有点困惑。我知道java sdk允许您传递一个名为update_skip_null_attributes
, yang membolehkan anda melangkau nilai nol tersebut dan mengemas kini hanya nilai yang mempunyai data. Saya tidak tahu apa yang setara dengannya, sebarang bantuan/tunjuk ajar akan menjadi bagus.
Kemas kini:
Cuba gunakan model berikut:
type usermodel struct { firstname string `json:"firstname,omitempty" dynamodbav:"firstname,omitempty"` lastname string `json:"lastname,omitempty" dynamodbav:"lastname,omitempty"` }
Ikuti nasihat yang diberikan oleh @jarmod dan @fedonev. Secara logik dan menggunakan dokumentasi adalah mungkin untuk memahami mengapa ini harus berfungsi, malangnya ia tidak
Memutuskan untuk menukar sdk daripada v1 kepada v2 untuk melihat sama ada mengemas kini ia akan membantu, walaupun saya terperangkap dalam keadaan yang sama sekali lagi. Inilah rupa fungsi kemas kini saya.
update :=expression.Set(expression.Name("firstName"),expression.Value(user.FirstName)) update.Set(expression.Name("lastName"), expression.Value(user.LastName)) expr, err := expression.NewBuilder().WithUpdate(update).Build() if err != nil { "log error here..." } _, err = svc.UpdateItem(context.TODO(), &dynamodb.UpdateItemInput{ TableName: aws.String("people"), Key: map[string]types.AttributeValue{"id": id}, ExpressionAttributeNames: expr.Names(), ExpressionAttributeValues: expr.Values(), UpdateExpression: expr.Update(), ReturnValues: types.ReturnValueUpdatedNew, }) if err != nil { "log error here..." }
Saya akhirnya menyelesaikan masalah saya dengan menulis pertanyaan dan mencipta fungsi yang cukup banyak menanyakan muatan json dengan id yang ingin kami kemas kini dan mengemas kini berdasarkan perbezaan perkara yang perlu kami tanyakan, sebarang medan kosong akan ditanya Penggantian hasil. Setakat ini ia menyelesaikan masalah saya, tetapi saya masih tertanya-tanya bagaimana untuk mengemas kininya dengan fungsi yang dimaksudkan.
Seperti komen @jarmod, medan bernilai sifar dilangkau apabila menggunakan dynamodbav:",omitempty"
tag pada marshalling structures:
type personupdate struct { firstname string `json:"firstname,omitempty" dynamodbav:",omitempty"` lastname string `json:"lastname,omitempty" dynamodbav:",omitempty"` status string `json:"status,omitempty" dynamodbav:",omitempty"` }
[EDIT: Penggunaan tambahan] marshalmap
Medan nilai sifar kini akan diabaikan, menghormati label. Lelaran di atas peta untuk membina ungkapan kemas kini:
av, _ := attributevalue.MarshalMap(person) update := expression.UpdateBuilder{} for k, v := range av { update = update.Set(expression.Name(k), expression.Value(v)) }
Bina ekspresi dan hantar outputnya kepada updateitem
seperti yang ditunjukkan dalam op.
Atas ialah kandungan terperinci Cara mengemas kini hanya satu medan dalam DynamoDB menggunakan AWS Go SDK. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!