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