Heim >Backend-Entwicklung >Golang >Wie implementiert man benutzerdefiniertes Marshalling und Unmarshalling, um als Go-Zeit in Go auf MongoDB-Daten zuzugreifen?

Wie implementiert man benutzerdefiniertes Marshalling und Unmarshalling, um als Go-Zeit in Go auf MongoDB-Daten zuzugreifen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-27 16:31:10977Durchsuche

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

Zugriff auf MongoDB von Go: Arbeiten mit benutzerdefinierten Datentypen

Bei der Interaktion mit MongoDB über Go kann es vorkommen, dass Sie beim Marshalling Datenwerte ändern oder konvertieren müssen und Unmarshalling. Dies kann auftreten, wenn Daten in einem bestimmten Format in MongoDB gespeichert sind, aber ein anderes Format in Ihrer Go-Struktur erfordern.

Betrachten wir ein Beispiel, bei dem EndDate als Zeichenfolge in MongoDB gespeichert ist, Sie aber als darauf zugreifen möchten eine Go-Zeit in Ihrer clientConfigData-Struktur.

type clientConfigData struct {
    SMTPAssoc      int       `bson:"smtp_assoc"`
    PlanType       string    `bson:"plan_type"`
    EndDate        string    `bson:"end_date"`
}

Um benutzerdefiniertes Marshalling und Unmarshalling zu implementieren, definieren Sie einen bson.Getter und bson.Setter-Schnittstelle.

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
}

In der SetBSON-Methode entmarshalieren wir zunächst den Rohwert und analysieren dann das EndDateStr-Feld, um das EndDate-Feld zu füllen. In der GetBSON-Methode formatieren wir das EndDate-Feld in eine Zeichenfolge, bevor wir es zurückgeben.

Mit dieser benutzerdefinierten Logik können Sie jetzt von MongoDB aus auf das EndDate als Go-Zeit zugreifen.

Das obige ist der detaillierte Inhalt vonWie implementiert man benutzerdefiniertes Marshalling und Unmarshalling, um als Go-Zeit in Go auf MongoDB-Daten zuzugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn