首页  >  文章  >  后端开发  >  如何在 Go 中实现自定义编组和解组以访问 MongoDB 数据作为 Go Time?

如何在 Go 中实现自定义编组和解组以访问 MongoDB 数据作为 Go Time?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-27 16:31:10947浏览

How to Implement Custom Marshalling and Unmarshalling to Access MongoDB Data as Go Time in Go?

从 Go 访问 MongoDB:使用自定义数据类型

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn