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