使用 Go 的 MongoDB 驱动程序将结构体插入 MongoDB 集合时,created_at 和 Updated_at 字段为设置为零时间 (0001-01-01T00:00:00.000 00:00)。这可能不是所需的行为,特别是如果这些字段需要存储创建和修改的实际时间。
MongoDB 服务器本身不支持自动填充created_at 和Updated_at 字段。但是,您可以通过创建自定义封送拆收器来实现此功能。
为您的 User 类型实现 bson.Marshaler 接口。这将允许您自定义结构在插入数据库之前如何编组为 BSON。
自定义编组器的 MarshalBSON 方法应执行以下步骤:
以下是自定义编组器的示例:
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中文网其他相关文章!