Pokud chcete změnit hodnotu nebo provést konverzi typu při zařazování / zrušení zařazování vašich hodnot z / do MongoDB, můžete to udělat implementací vlastní logiky zařazování / rozřazování.
Můžete to udělat implementací bson.Getter
a bson.Setter
rozhraní. Uvnitř těchto metod můžete s hodnotami, které jsou zařazeny / unmarshaled, dělat, co chcete.
Nejjednodušší je rozšířit vaše clientConfigData
zadejte s dalším polem, které bude typu time.Time
, hodnotu, kterou potřebujete:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Má hodnotu značky bson:"-"
, protože nechceme, aby se to objevilo v MongoDB.
A nyní vlastní logika zařazování / rozpojování:
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
}
Zde se stane, že SetBSON()
je zodpovědný za „vyplnění“ vaší hodnoty struct nezpracovanou hodnotou pocházející z MongoDB a GetBSON()
je odpovědný za poskytnutí hodnoty, kterou chcete uložit (zařazenou).
Při načítání:SetBSON()
nejprve zruší hodnotu tak, jak je, a poté správně nastaví EndDate
pole (které je typu time.Time
) z string
hodnota data, která přišla z databáze (EndDateStr
).
Při ukládání:GetBSON()
nejprve vyplní EndDateStr
pole (to, které je uloženo) z EndDate
pole a poté se jednoduše vrátí, což signalizuje, že je v pořádku uložit.
Jedna věc, kterou je třeba poznamenat:obě SetBSON()
a GetBSON()
vytvořit nový my
zadejte do nich. Důvodem je zabránit přetečení zásobníku. Jednoduše vrátí hodnotu typu clientConfigData
je špatné, protože jsme implementovali bson.Getter
a bson.Setter
, takže SetBSON()
a GetBSON()
by byl volán donekonečna. Nový my
type tyto metody nemá, takže nedochází k nekonečné "rekurzi" (type
klíčové slovo vytváří nový typ a „nedědí“ metody základního typu).
Viz také související / podobná otázka:Nastavte výchozí datum při vkládání dokumentu s polem time.Time