Golang / mgo:如何在mongodb中存储日期(不是ISODate)?

时间:2016-06-23 11:36:01

标签: mongodb go mgo isodate

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

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?

2 个答案:

答案 0 :(得分:0)

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

您可以通过实施包mgo/bson中的GetterSetter接口来强制mgo正确(de)序列化您的类型,因为它认为它非常低级别所以要小心

答案 1 :(得分:0)

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

您可以定义一个自定义Unmashal,用于更改加载日期的位置。

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
}

像这样的东西应该可以做到这一点,它没有经过测试,只是为了给你一个想法!