使用Go 與MongoDB 互動時,可能會遇到需要在編組過程中修改或轉換資料值的情況和解組。當資料以特定格式儲存在 MongoDB 中但在 Go 結構中需要不同的格式時,可能會發生這種情況。
讓我們考慮一個範例,其中 EndDate 在 MongoDB 中儲存為字串,但您希望將其存取為您的 clientConfigData 結構中的 Go Time。
type clientConfigData struct { SMTPAssoc int `bson:"smtp_assoc"` PlanType string `bson:"plan_type"` EndDate string `bson:"end_date"` }
要實作自訂編組和解組,請定義一個 bson.Getter 和bson.Setter 介面。
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 }
在 SetBSON 方法中,我們先解組原始值,然後解析 EndDateStr 欄位以填入 EndDate 欄位。在 GetBSON 方法中,我們在返回之前將 EndDate 欄位格式化為字串。
使用此自訂邏輯,您現在可以從 MongoDB 存取 EndDate 作為 Go Time。
以上是如何在 Go 中實作自訂編組和解組以存取 MongoDB 資料作為 Go Time?的詳細內容。更多資訊請關注PHP中文網其他相關文章!