Bagaimana untuk Melaksanakan Custom Marshalling dan Unmarshalling untuk Mengakses Data MongoDB sebagai Go Time dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-11-27 16:31:10
asal
945 orang telah melayarinya

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

Mengakses MongoDB daripada Go: Bekerja dengan Jenis Data Tersuai

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"`
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan