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フィールドを使用してドキュメントを挿入するときにデフォルトの日付を設定する