In Go time.Time
是一個不能有nil
值的結構。它有一個零值(這是所有結構字段都有其零值),但是這個零值對應於MongoDB ISODate("0001-01-01T00:00:00Z")
而不是MongoDB null
的值。
如果你的領域是time.Time
類型,則不能將任何值設置爲它結束了MongoDB的null
值。
最簡單的解決方案是使用指向time.Time
的類型指針字段,即*time.Time
。如果您將此字段保留或設置爲Go nil
,它將在MongoDB中以null
結尾。
如果您不能或不想使用*time.Time
,還有一個「解決辦法」:宣佈2場,一個是你的「正規」 time.Time
型的,並使用一個struct tag從MongoDB中排除這一點。並添加另一個類型爲*time.Time
的字段,並將其映射到MongoDB。然後編寫一個自定義編組/編組邏輯,當編組時將根據原始數據更新此額外字段,或者在解組時將基於額外字段設置原始編碼。
這是一個例子怎麼可能是這樣的:
type User struct {
CreatedAt time.Time `bson:"-"`
PCreatedAt *time.Time `bson:"created"`
}
func (u *User) GetBSON() (interface{}, error) {
if u.CreatedAt.IsZero() {
u.PCreatedAt = nil
} else {
u.PCreatedAt = &u.CreatedAt
}
return u, nil
}
func (u *User) SetBSON(raw bson.Raw) (err error) {
if err = raw.Unmarshal(u); err != nil {
return
}
if u.PCreatedAt == nil {
u.CreatedAt = time.Time{}
} else {
u.CreatedAt = *u.PCreatedAt
}
return
}
說明:
持有time.Time
值,你可以工作(讀/寫)。該字段從MongoDB中排除。
有一個指針User.PCreatedAt
字段映射到MongoDB中的created
屬性。
當User
被編組(保存到MongoDB)時,調用GetBSON()
。如果CreatedAt
是零值,則將PCreatedAt
設置爲nil
,這將在MongoDB中最終爲null
。否則設置/使用非零時間戳。
當User
解組(從MongoDB加載)時,調用SetBSON()
。這將檢查PCreatedAt
是否爲nil
(對應於MongoDB null
),如果是,則將CreatedAt
設置爲其零值。否則使用從MongoDB檢索的時間戳。
相關/類似的問題:
Set default date when inserting document with time.Time field
Accesing MongoDB from Go
非常感謝。我不會像你向我展示的那樣做這件事,但你的回答給了我一個很好的主意,如何解決這個問題。再次感謝! – SokIsKedu