Mongodb 如何使用mongo go驱动程序而不是日期(-62135596800000)为日期字段分配空值

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

我有两台MongoDB服务器。我使用mongo go驱动程序从其中一个接收数据。接收到的数据有一个日期字段,该字段总是
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
值的结构。它有一个零值(即所有结构字段都有零值),但该零值对应于MongoDB
ISODate(“0001-01-01T00:00:00Z”)
,而不是MongoDB
null

如果字段的类型为
time.time
,则不能将任何值设置为MongoDB
null

最简单的解决方案是使用指向
time.time
的指针类型的字段,即
*time.time
。如果您离开或将此字段设置为Go
nil
,它将在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
(对应于MongoDB
null
),如果是,则将
CreatedAt
设置为其零值。Else使用从MongoDB检索的时间戳

相关/类似问题:

mongodb文档

行为

在内部,日期对象存储为64位整数,表示自Unix纪元(1970年1月1日)以来的毫秒数,这导致过去和未来的可表示日期范围约为2.9亿年


非常感谢。我不会按照你给我的方式来做,但是你的回答给了我一个很好的解决方法。再次感谢!我以前读过文档。mongodb没有问题。probloem使用的是Go语言,因为它会自动将日期值设置为空字段。我必须用类似于icza建议的指针来解决这个问题。还是谢谢