2017-04-27 34 views
1

我有兩個MongoDB服務器。從一個我使用mongo go驅動程序接收數據。收到的數據有一個日期字段,始終爲null。然後在我的代碼中,我可能會或可能不會將其更改爲其他日期,或將其保留爲null,並將接收到的數據發送到其他服務器。如何使用mongo go驅動程序而不是日期分配空值到日期字段(-62135596800000)

的問題是,當我發佈的數據,時間字段變成

日期(-62135596800000),而不是空。

我試圖分配time.Time{}並且下面的代碼也沒有解決問題。

t, err := time.Parse("2006-01-02T15:04:05Z", "0001-01-01T00:00:01Z") 
      if err != nil { 
       fmt.Println(err) 
      } 
      retrieved[i].SessionEndedDateUTC = t 

每次我得到Date(-62135596800000)而不是空,即使我檢索數據和更新插入它無需修改。

回答

1

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

+0

非常感謝。我不會像你向我展示的那樣做這件事,但你的回答給了我一個很好的主意,如何解決這個問題。再次感謝! – SokIsKedu

0

mongodb的DOC

行爲

在內部,日期對象存儲爲代表的毫秒數64位整數自Unix時代(1970年1月1日),這導致了可表示的da約290百萬年前到過去TE範圍和未來

看到https://docs.mongodb.com/manual/reference/method/Date/

+0

我已閱讀過文檔。這與MongoDB不存在問題。這個問題與Go語言有關,因爲它會自動將Date值設置爲空字段。我必須用icza建議的非常類似的指針來解決它。還是謝謝 – SokIsKedu

相關問題