Ако искате да промените стойност или да направите преобразуване на тип при маршалиране / демаршалиране на вашите стойности от / към 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