Ако искате да промените стойност или да направите преобразуване на тип при маршалиране / демаршалиране на вашите стойности от / към MongoDB, можете да го направите, като внедрите персонализирана логика за маршалиране / демаршалиране.
Можете да направите това, като внедрите bson.Getter и bson.Setter интерфейси. Вътре в тези методи можете да правите каквото искате със стойностите, които се маршалират/демаршалират.
Най-лесно е да разширите вашите clientConfigData въведете с допълнително поле, което ще бъде от тип time.Time , стойността, от която се нуждаете:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Той има стойност на маркера bson:"-" , защото не искаме това да се показва в MongoDB.
И сега персонализираната логика за маршалиране / демаршалиране:
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
}
Това, което се случва тук, е, че SetBSON() е отговорен да "попълни" стойността на вашата структура с необработената стойност, идваща от MongoDB и GetBSON() е отговорен да предостави стойност, която искате да бъде запазена (маршалирана).
При зареждане:SetBSON() първо демаршали стойността такава, каквато е, след това правилно задава EndDate поле (което е от тип time.Time ) от string стойност за дата, която дойде от DB (EndDateStr ).
При записване:GetBSON() първо попълва EndDateStr полето (това, което е запазено) от EndDate поле и след това просто се връща, като сигнализира, че е добре да се запази.
Едно нещо, което трябва да се отбележи:и двете SetBSON() и GetBSON() създайте нов my напишете вътре в тях. Причината за това е да се избегне препълването на стека. Просто връщане на стойност от тип clientConfigData е лошо, защото внедрихме bson.Getter и bson.Setter , така че SetBSON() и GetBSON() ще ви се обаждат безкрайно. Новият my type няма тези методи, така че безкрайната "рекурсия" не се случва (type ключова дума създава нов тип и не "наследява" методи на основния тип).
Вижте също свързан / подобен въпрос:Задаване на дата по подразбиране при вмъкване на документ с полето time.Time