Jika Anda ingin mengubah nilai atau melakukan konversi jenis saat menyusun / menghapus nilai Anda dari / ke MongoDB, Anda dapat melakukannya dengan menerapkan logika marshaling / unmarshaling khusus.
Anda dapat melakukannya dengan menerapkan bson.Getter
dan bson.Setter
antarmuka. Di dalam metode ini, Anda dapat melakukan apa pun yang Anda inginkan dengan nilai-nilai yang dirangkai / tidak dicakup.
Cara termudah adalah dengan memperluas clientConfigData
Anda ketik dengan bidang tambahan, yang akan bertipe time.Time
, nilai yang Anda butuhkan:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Ini memiliki nilai tag bson:"-"
, karena kami tidak ingin ini muncul di MongoDB.
Dan sekarang logika marshaling / unmarhsaling kustom:
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
}
Apa yang terjadi di sini adalah SetBSON()
bertanggung jawab untuk "mengisi" nilai struct Anda dengan nilai mentah yang berasal dari MongoDB, dan GetBSON()
bertanggung jawab untuk memberikan nilai yang ingin Anda simpan (disusun).
Saat memuat:SetBSON()
pertama-tama batalkan nilai apa adanya, lalu setel EndDate
dengan benar field (yang bertipe time.Time
) dari string
nilai tanggal yang berasal dari DB (EndDateStr
).
Saat menyimpan:GetBSON()
pertama isi EndDateStr
bidang (yang disimpan) dari EndDate
bidang, dan kemudian kembali, menandakan bahwa tidak apa-apa untuk menyimpan.
Satu hal yang perlu diperhatikan:keduanya SetBSON()
dan GetBSON()
buat my
. baru ketik di dalamnya. Alasan untuk ini adalah untuk menghindari stack overflow. Cukup mengembalikan nilai tipe clientConfigData
buruk, karena kami menerapkan bson.Getter
dan bson.Setter
, jadi SetBSON()
dan GetBSON()
akan dipanggil tanpa henti. my
. yang baru type tidak memiliki metode ini, jadi "rekursi" tanpa akhir tidak terjadi (type
kata kunci membuat jenis baru, dan tidak "mewarisi" metode dari jenis yang mendasarinya).
Lihat juga pertanyaan terkait / serupa:Setel tanggal default saat memasukkan dokumen dengan waktu. Bidang waktu