使用 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中文网其他相关文章!