【问题标题】:Golang/mgo : How can I store Date (not ISODate) in mongodb?Golang/mgo:如何在 mongodb 中存储日期(不是 ISODate)?
【发布时间】:2020-06-17 20:48:24
【问题描述】:

如果我这样存储当前时间:

type Test struct {
    Id string `bson:"id" json:"id,omitempty"`
    TestTime time.Time `bson:"testTime" json:"testTime,omitempty"`
}
...

t := Test {
    Id : "TEST0001",
    TestTime : time.Now(),
}
...

c.Insert(t)

然后我使用 mongochef 搜索它:

{ 
    "_id" : ObjectId("576bc7a48114a14b47920d60"), 
    "id" : "TEST0001", 
    "testTime" : ISODate("2016-06-23T11:27:30.447+0000")
}

那么,mgo 默认存储 ISODate,如何存储 Date 而不是 ISODate 呢?

【问题讨论】:

    标签: mongodb go mgo isodate


    【解决方案1】:

    mgo 自动将 time.Time 转换为 Mongo 内部日期数据类型(source,实际上它只是一个没有时区信息的时间戳,并且总是更正为 UTC)。任何其他功能都必须由您手动实现。

    您可以通过实现包mgo/bson 中的GetterSetter 接口来强制mgo 正确(反)序列化您的类型,因为这是非常低级的,所以要小心。

    【讨论】:

      【解决方案2】:

      您应该定义一个保存时区的自定义结构,例如 this

      您可以定义一个自定义的Unmarshal 来更改加载日期的位置。

      func (t *TimeWithTimezone) Unmarshal(in []byte, out interface{}) (err error) {
          type decode TimeWithTimezone
          var d decode
          if err := bson.NewDecoder(in).Decode(&d); err != nil {
              return err
          }
          loc, err := FixedZone(d.Timezone, d.Timezone)
          if err != nil {
              return fmt.Errorf("Invalid Timezone: %s", d.Timezone)
          }
          t.Time = d.Time.In(loc)
          t.Timezone = d.Timezone
          return nil
      }
      

      这样的东西应该可以解决问题,它没有经过测试,只是为了给你一个想法!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 2017-01-16
        • 2017-07-11
        • 2017-05-21
        • 2020-11-28
        • 2012-03-18
        • 2017-11-05
        相关资源
        最近更新 更多