带有 Time.Time 字段的 Mgo 文档的默认日期插入
简介
在 MongoDB 中,可以为文档字段设置默认值。这对于在文档创建期间自动填充特定值的字段非常有用,例如时间戳字段。
问题
在 Mgo(MongoDB 的 Go 驱动程序)中,没有直接的方法来定义Mongoose JavaScript 模型中字段的默认值。开发人员正在寻找一种解决方案,在创建文档时自动将日期或时间值插入到文档字段中。
解决方案
在 Mgo 中设置默认日期值有两种主要方法:
-
构造函数函数:
- 创建一个类似构造函数的函数,用于设置所需的字段值,例如 CreatedAt。
- 始终使用此函数创建新文档实例。
- 这种方法提供了对何时设置默认值的控制,但需要手动
-
自定义封送处理:
- 在自定义结构体中实现 bson.Getter 接口以在之前提供值它实际上被保存了。
- 使用 GetBSON() 返回结构的副本设置所需的字段值(如果尚未设置)。
- 这种方法更加自动化,但需要仔细考虑以避免潜在的堆栈溢出或意外覆盖现有值。
实现示例
对于自定义封送处理方法,这里有一个示例实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import (
"context"
"time"
"github.com/globalsign/mgo/bson"
)
type User struct {
CreatedAt time.Time `json: "created_at" bson: "created_at" `
}
func (u *User) GetBSON() ( interface {}, error) {
if u.CreatedAt.IsZero() {
u.CreatedAt = time.Now()
}
type my *User
return my(u), nil
}
func main() {
session, err := mgo.Dial( "localhost:27017" )
if err != nil {
panic(err)
}
defer session.Close()
c := session.DB( "mydb" ).C( "users" )
user := User{}
err = c.Insert(user)
if err != nil {
panic(err)
}
}
|
登录后复制
在此示例中,当新的 User 文档插入数据库时,CreatedAt 字段将自动设置为当前时间。这是通过重写 GetBSON() 方法以在数据库驱动程序尝试序列化对象以进行插入时提供修改后的结构值来实现的。
以上是如何设置 Mgo 文档中 Time.Time 字段的默认日期值?的详细内容。更多信息请关注PHP中文网其他相关文章!