当前位置: 首页 > 面试题库 >

在插入带有时间的文档时设置默认日期。时间字段

梁丘弘
2023-03-14
问题内容

mongoosenode.js)中,我可以定义一个默认的模型架构,Date.now如下所示:

...
type: Date,
default: Date.now
...

如何实现相同的目的而不必time.Time每次创建文档时都插入mgo

type User struct {
    CreatedAt   time.Time `json:"created_at" bson:"created_at"` // Make this field filled automatically with time.Now() every time a document of this `struct` is inserted
}

问题答案:

在Go中,您无法定义字段的默认值,当创建新的struct值时,它们将始终是其类型的零值(除非您使用复合文字,可以在其中显式给出其他值)。

因此,一种选择是创建一个类似于构造函数的函数NewUser(),该函数将设置该字段,并始终使用此函数来创建新用户:

func NewUser() *User {
    return &User{
        CreatedAt: time.Now(),
    }
}

当然,不能强制这样做,这也将保留User结构值创建的时间戳,而不是保存它的时间。

另一种更好的方法是使用自定义封送处理逻辑。

您可以通过实现编写自定义封送处理逻辑bson.GetterGetBSON()负责提供将实际保存的值。我们希望User保存相同的实例,只是CreatedAt要先设置其字段:

type User struct {
    CreatedAt time.Time `json:"created_at" bson:"created_at"`
}

func (u *User) GetBSON() (interface{}, error) {
    u.CreatedAt = time.Now()
    type my *User
    return my(u), nil
}

请注意,将my创建并返回一个新类型。这样做的原因是为了避免堆栈溢出。简单地返回type的值*User是不好的,因为它实现了bson.Getter,因此GetBSON()将被无限地调用。新my类型没有此方法,因此不会发生无休止的“递归”(type关键字创建了新类型,并且它没有“继承”基础类型的方法)。

请注意,CreatedAt即使您只想重新保存,此解决方案也会覆盖(重置)字段User。因此,我们应该添加一个检查CreatedAt字段是否已填充,并且仅在它为零值时才进行设置:

func (u *User) GetBSON() (interface{}, error) {
    if u.CreatedAt.IsZero() {
        u.CreatedAt = time.Now()
    }
    type my *User
    return my(u), nil
}


 类似资料:
  • 但以下内容: 只是管用。 日期的大小写相同。

  • 问题内容: 是否可以使用NOW()将默认时间添加为10分钟? 我已经尝试过类似的方法: 但是,它不起作用。 问题答案: 我不认为你可以做到这一点。 在MySQL的文件指出: 数据类型规范中的DEFAULT value子句指示列的默认值。除一个例外,默认值必须为常数;否则为0。它不能是函数或表达式。例如,这意味着您不能将日期列的默认值设置为诸如NOW()或CURRENT_DATE之类的函数的值。唯一

  • 问题内容: 我需要为一个表创建一个timestamp字段,该表的行在一定时间后需要过期。如果我使用以下内容: 它以一种人类可读的格式显示时间,如果我可以将时间设置为纪元时间,则可以轻松得多,这样我就可以用几秒钟的时间进行计算。有没有一种方法可以创建一个字段,当默认情况下以纪元时间创建行时,该字段将显示当前时间?谢谢! 问题答案: 您可能希望在语句中使用该函数,如以下示例所示:

  • 问题内容: 我对约会有点困惑。我目前正在使用天气应用程序,并且一切正常。.我只是想将这种类型的格式处理成我自己想要的格式。 我只是想将此日期转换为大纪元时间,然后以所需的格式结算日期:: 对于J-SON 或者我想将此日期转换为更少的数字,例如,Sun,9月9日9:23 Am等。 http://dataservice.accuweather.com/currentconditions/v1/2570

  • 问题内容: 我有一个脚本,需要在脚本的不同行执行以下命令: 在我的陈述中,我有以下内容: 我收到以下错误: 如果我将语句的顺序更改为: 我收到以下错误: 如果我再次将语句更改为: 我收到以下错误: 这是怎么回事,我怎么都可以工作? 问题答案: 您的麻烦是,您有一些代码希望对 模块 进行引用,而其他代码希望对类进行引用 。 显然,不能两者兼有。 当您这样做时: 您首先要设置为对该类的引用,然后立即将

  • 问题内容: 我正在做一个自动化的查询。它需要查找最后一天晚上8点到晚上8点之间的所有交易。我当时正在考虑做这样的事情 对于自动查询,这很适合找出日期部分。但是变量的TIME部分是查询执行的当前时间。有没有一种快速简单的方法来将两个变量的时间部分硬编码为8:00 PM? 问题答案: