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!