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のフィールド(保存されているフィールド) フィールドに移動し、単に戻って、保存しても問題がないことを通知します。
注意すべき1つのこと:両方のSetBSON() およびGetBSON() 新しいmyを作成します それらの中に入力します。これは、スタックオーバーフローを回避するためです。タイプclientConfigDataの値を返すだけです bson.Getterを実装したので、悪いです およびbson.Setter 、したがってSetBSON() およびGetBSON() 延々と呼ばれるでしょう。新しいmy typeにはこれらのメソッドがないため、無限の「再帰」は発生しません(type キーワードは新しいタイプを作成し、基になるタイプのメソッドを「継承」しません。
関連/同様の質問も参照してください:time.Timeフィールドを使用してドキュメントを挿入するときにデフォルトの日付を設定する