首頁 > 後端開發 > Golang > 如何在 Go 中實作自訂編組和解組以存取 MongoDB 資料作為 Go Time?

如何在 Go 中實作自訂編組和解組以存取 MongoDB 資料作為 Go Time?

Mary-Kate Olsen
發布: 2024-11-27 16:31:10
原創
1023 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板