Mongodb 如何使用mongo go驱动程序而不是日期(-62135596800000)为日期字段分配空值
我有两台MongoDB服务器。我使用mongo go驱动程序从其中一个接收数据。接收到的数据有一个日期字段,该字段总是Mongodb 如何使用mongo go驱动程序而不是日期(-62135596800000)为日期字段分配空值,mongodb,go,time,mgo,Mongodb,Go,Time,Mgo,我有两台MongoDB服务器。我使用mongo go驱动程序从其中一个接收数据。接收到的数据有一个日期字段,该字段总是null。然后,在我的代码中,我可能会也可能不会将其更改为其他日期,或者将其保留为null,并将接收到的数据放入其他服务器 问题是,当我发布数据时,时间字段变为 日期(-62135596800000),而不是空值 我试图分配时间。时间{}下面的代码也没有解决问题 t, err := time.Parse("2006-01-02T15:04:05Z", "0001-01-01T00
null
。然后,在我的代码中,我可能会也可能不会将其更改为其他日期,或者将其保留为null
,并将接收到的数据放入其他服务器
问题是,当我发布数据时,时间字段变为
日期(-62135596800000),而不是空值
我试图分配时间。时间{}
下面的代码也没有解决问题
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)
而不是null,即使我检索数据并在不修改的情况下向上插入它。在Go中是一个不能有nil
值的结构。它有一个零值(即所有结构字段都有零值),但该零值对应于MongoDBISODate(“0001-01-01T00:00:00Z”)
,而不是MongoDBnull
值
如果字段的类型为time.time
,则不能将任何值设置为MongoDBnull
值
最简单的解决方案是使用指向time.time
的指针类型的字段,即*time.time
。如果您离开或将此字段设置为Gonil
,它将在MongoDB中以null
结束
如果您不能或不想使用*time.time
,仍然有一个“解决方法”:声明两个字段,一个是“常规”的time.time
类型,并使用a将其从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
}
说明:
User.CreatedAt
保存可以使用(读/写)的time.time
值。此字段被排除在MongoDB之外
有一个指针User.PCreatedAt
字段,该字段映射到MongoDB中的created
属性
当一个用户
被封送(保存到MongoDB)时,调用GetBSON()
。如果CreatedAt
为零值,则将PCreatedAt
设置为nil
,这将在MongoDB中结束为null
。Else设置/使用非零时间戳
当用户
被解组(从MongoDB加载)时,调用SetBSON()
。这将检查PCreatedAt
是否为nil
(对应于MongoDBnull
),如果是,则将CreatedAt
设置为其零值。Else使用从MongoDB检索的时间戳
相关/类似问题:
mongodb文档
行为
在内部,日期对象存储为64位整数,表示自Unix纪元(1970年1月1日)以来的毫秒数,这导致过去和未来的可表示日期范围约为2.9亿年
见非常感谢。我不会按照你给我的方式来做,但是你的回答给了我一个很好的解决方法。再次感谢!我以前读过文档。mongodb没有问题。probloem使用的是Go语言,因为它会自动将日期值设置为空字段。我必须用类似于icza建议的指针来解决这个问题。还是谢谢