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에서 Go Time으로 EndDate에 액세스할 수 있습니다.
위 내용은 이동 중에 MongoDB 데이터에 액세스하기 위해 사용자 정의 마샬링 및 역마샬링을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!