首页 > 后端开发 > Golang > 正文

如何在 MongoDB 插入之前自动填充 Go 结构中的'created_at”和'updated_at”字段?

Mary-Kate Olsen
发布: 2024-11-24 19:08:11
原创
126 人浏览过

How to Automatically Populate `created_at` and `updated_at` Fields in Go Structs Before MongoDB Insertion?

插入 MongoDB 之前自动填充 Go 结构体中的created_at 和updated_at

使用 Go 的 MongoDB 驱动程序将结构体插入 MongoDB 集合时,created_at 和 Updated_at 字段为设置为零时间 (0001-01-01T00:00:00.000 00:00)。这可能不是所需的行为,特别是如果这些字段需要存储创建和修改的实际时间。

自定义封送拆收器

MongoDB 服务器本身不支持自动填充created_at 和Updated_at 字段。但是,您可以通过创建自定义封送拆收器来实现此功能。

实现 bson.Marshaler

为您的 User 类型实现 bson.Marshaler 接口。这将允许您自定义结构在插入数据库之前如何编组为 BSON。

自定义编组器的 MarshalBSON 方法应执行以下步骤:

  1. If CreatedAt为零,将其设置为当前时间。
  2. 将 UpdatedAt 设置为当前时间time。
  3. 使用基本 bson.Marshal 函数将结构编组为 BSON。

以下是自定义编组器的示例:

func (user *User) MarshalBSON() ([]byte, error) {
    if user.CreatedAt.IsZero() {
        user.CreatedAt = time.Now()
    }
    user.UpdatedAt = time.Now()

    type my User
    return bson.Marshal((*my)(user))
}
登录后复制

用法

要使用自定义封送拆收器,请记住在将 User 结构插入到的任何位置都使用它使用 InsertOne 方法插入数据库。您必须将指向 User 结构的指针作为参数传递。

示例:

user := &User{Name: "username"}

c := client.Database("db").Collection("collection")
if _, err := c.InsertOne(context.Background(), user); err != nil {
    // handle error
}
登录后复制

请注意,如果将自定义封送拆收器嵌入到更大的结构中,则自定义封送拆收器将不起作用。为了避免此问题,您可以对整个嵌入结构使用自定义封送拆收器。

以上是如何在 MongoDB 插入之前自动填充 Go 结构中的'created_at”和'updated_at”字段?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板