Jeśli chcesz zmienić wartość lub przeprowadzić konwersję typu podczas kierowania/odprowadzania wartości z/do MongoDB, możesz to zrobić, implementując niestandardową logikę kierowania/odprowadzania.
Możesz to zrobić, implementując bson.Getter i bson.Setter interfejsy. Wewnątrz tych metod możesz robić, co chcesz, z wartościami, które są gromadzone / przekazywane.
Najłatwiej jest rozszerzyć swoje clientConfigData wpisz z dodatkowym polem, które będzie typu time.Time , potrzebna wartość:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Ma wartość tagu bson:"-" , ponieważ nie chcemy, aby pojawiło się to w MongoDB.
A teraz niestandardowa logika marshalingu / unmarhsalingu:
const endDateLayout = "2006-01-02 15:04:05" // Use your layout here
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
}
func (c *clientConfigData) GetBSON() (interface{}, error) {
c.EndDateStr = c.EndDate.Format(endDateLayout)
type my *clientConfigData
return my(c), nil
}
Dzieje się tak, że SetBSON() jest odpowiedzialny za „wypełnienie” wartości struktury surową wartością pochodzącą z MongoDB i GetBSON() jest odpowiedzialny za dostarczenie wartości, którą chcesz zapisać (zorganizować).
Podczas ładowania:SetBSON() najpierw rozpakowuje wartość bez zmian, a następnie odpowiednio ustawia EndDate pole (które jest typu time.Time ) z string wartość daty pochodząca z bazy danych (EndDateStr ).
Podczas zapisywania:GetBSON() najpierw wypełnia EndDateStr pole (to, które jest zapisane) z EndDate pole, a następnie po prostu wraca, sygnalizując, że można zapisać.
Jedna rzecz do zapamiętania:zarówno SetBSON() i GetBSON() utwórz nowy my wpisz w nich. Powodem tego jest uniknięcie przepełnienia stosu. Po prostu zwracam wartość typu clientConfigData jest złe, ponieważ zaimplementowaliśmy bson.Getter i bson.Setter , więc SetBSON() i GetBSON() zostanie wywołany bez końca. Nowy my type nie ma tych metod, więc nie ma niekończącej się "rekursji" (type słowo kluczowe tworzy nowy typ i nie „dziedziczy” metod typu bazowego).
Zobacz także powiązane / podobne pytanie:Ustaw domyślną datę podczas wstawiania dokumentu z czasem.Pole czasu