Apabila berinteraksi dengan MongoDB menggunakan Go, anda mungkin menghadapi situasi di mana anda perlu mengubah suai atau menukar nilai data semasa marshalling dan unmarshalling. Ini boleh berlaku apabila data disimpan dalam format tertentu dalam MongoDB tetapi memerlukan format yang berbeza dalam struct Go anda.
Mari kita pertimbangkan contoh di mana EndDate disimpan sebagai rentetan dalam MongoDB, tetapi anda ingin mengaksesnya sebagai a Go Time dalam struct clientConfigData anda.
type clientConfigData struct { SMTPAssoc int `bson:"smtp_assoc"` PlanType string `bson:"plan_type"` EndDate string `bson:"end_date"` }
Untuk melaksanakan marshalling dan unmarshalling tersuai, tentukan bson.Getter dan bson.Setter antara muka.
import ( "context" "time" "github.com/mongodb/mongo-go-driver/bson" ) type clientConfigData struct { SMTPAssoc int `bson:"smtp_assoc"` PlanType string `bson:"plan_type"` EndDateStr string `bson:"end_date"` EndDate time.Time `bson:"-"` // Excluded from MongoDB } const endDateLayout = "2006-01-02 15:04:05" // bson.Setter implementation func (c *clientConfigData) SetBSON(raw bson.Raw) (err error) { type my clientConfigData if err = raw.Unmarshal((*my)(c)); err != nil { return } c.EndDate, err = time.Parse(endDateLayout, c.EndDateStr) return } // bson.Getter implementation func (c *clientConfigData) GetBSON() (interface{}, error) { c.EndDateStr = c.EndDate.Format(endDateLayout) type my *clientConfigData return my(c), nil } // Custom code to query MongoDB func FindConfig(ctx context.Context, client *mongo.Client) (*clientConfigData, error) { var configRes *clientConfigData err := client.Database("test").Collection("clientconfig").FindOne(ctx, bson.M{}).Decode(&configRes) if err != nil { return nil, errors.Wrap(err, "finding config collection") } return configRes, nil }
Dalam kaedah SetBSON, kami mula-mula menyahmarshal nilai mentah dan kemudian menghuraikan medan EndDateStr untuk mengisi medan EndDate. Dalam kaedah GetBSON, kami memformat medan EndDate kepada rentetan sebelum mengembalikannya.
Menggunakan logik tersuai ini, anda kini boleh mengakses EndDate sebagai Masa Pergi daripada MongoDB.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Custom Marshalling dan Unmarshalling untuk Mengakses Data MongoDB sebagai Go Time dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!