Mengemas kini Medan MongoDB dengan Bendera Omitempty dalam Struktur Golang
Bendera omitempty dalam struktur Golang membolehkan pembangun mengecualikan medan daripada marshalling JSON jika mereka mempunyai nilai sifar. Walau bagaimanapun, tingkah laku ini boleh menimbulkan cabaran apabila mengemas kini dokumen MongoDB.
Pertimbangkan borang Kupon yang sesetengah medan adalah pilihan. Struktur Golang yang mewakili borang mungkin mempunyai bendera yang diabaikan pada medan ini seperti:
type Coupon struct { Id int `json:"id,omitempty" bson:"_id,omitempty"` Name string `json:"name,omitempty" bson:"name,omitempty"` Code string `json:"code,omitempty" bson:"code,omitempty"` Description string `json:"description,omitempty" bson:"description,omitempty"` Status bool `json:"status" bson:"status"` MaxUsageLimit int `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"` SingleUsePerUser bool `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"` }
Masalah
Isu timbul apabila mengemas kini borang. Jika kotak semak yang telah ditandakan sebelum ini (medan bool) dinyahtanda semasa penyerahan borang, bendera omitempty mengecualikannya daripada struktur. Akibatnya, nilai tidak dikemas kini dalam dokumen MongoDB.
Begitu juga, jika hanya medan yang diperlukan disediakan dalam permintaan REST API, MongoDB akan menimpa keseluruhan dokumen, termasuk nilai yang tidak sepatutnya dikemas kini.
Penyelesaian
Untuk mengatasi isu ini, adalah perlu untuk menukar medan beranotasi dengan mengabaikan penunjuk. Ini membolehkan medan mempunyai nilai sifar, yang mewakili keadaan "tidak dikemas kini":
type Coupon struct { Id *int `json:"id,omitempty" bson:"_id,omitempty"` Name string `json:"name,omitempty" bson:"name,omitempty"` Code string `json:"code,omitempty" bson:"code,omitempty"` Description string `json:"description,omitempty" bson:"description,omitempty"` Status *bool `json:"status" bson:"status"` MaxUsageLimit *int `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"` SingleUsePerUser *bool `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"` }
Dengan pengubahsuaian ini, penunjuk sifar menunjukkan bahawa medan itu tidak boleh dikemas kini. Jika penunjuk bukan nol disediakan, nilainya akan ditetapkan dalam dokumen MongoDB. Ini secara berkesan menyelesaikan isu dengan mengemas kini medan bool dan int sambil mengekalkan bendera omitempty.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Kemas Kini MongoDB dengan Bendera `omitempty` Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!