使用 Golang 自动执行 MongoDB 中的 Created_at 和 Updated_at 字段
在提供的代码片段中,User 结构缺乏对 Created_at 和 Updated_at 字段的自动化。这些字段对于跟踪时间事件至关重要。
解决方案
MongoDB 服务器缺乏对自动字段填充的支持。为此,您可以为 User 结构实现自定义封送处理函数。通过实现 bson.Marshaler 接口,您可以控制结构体如何序列化为 BSON。
实现
以下是如何实现 MarshalBSON 函数:
import ( "context" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" ) type User struct { ID primitive.ObjectID `bson:"_id,omitempty"` CreatedAt time.Time `bson:"created_at"` UpdatedAt time.Time `bson:"updated_at"` Name string `bson:"name"` } func (u *User) MarshalBSON() ([]byte, error) { if u.CreatedAt.IsZero() { u.CreatedAt = time.Now() } u.UpdatedAt = time.Now() type my User return bson.Marshal((*my)(u)) }
必须注意MarshalBSON函数有一个指针接收器,并且必须使用封送时指向您的 User 值的指针。
用法
实现自定义封送功能后,您可以像这样使用它:
client := mongo.NewClient(...) // (redacted for brevity) c := client.Database("db").Collection("collection") if _, err := c.InsertOne(context.Background(), &user); err != nil { // handle error }
说明
MarshalBSON 函数检查如果created_at字段为空,则将其设置为当前时间。然后它将 Updated_at 字段设置为当前时间。通过使用类型别名 (my) 并将 User 结构强制转换为 *my,可以避免编组过程中潜在的堆栈溢出。
以上是如何使用 Golang 在 MongoDB 中自动创建 Created_at 和 Updated_at 时间戳?的详细内容。更多信息请关注PHP中文网其他相关文章!