推入 mongodb 时自动填充 golang 结构中的 created_at 和 updated_at

Autofill created_at and updated_at in golang struct while pushing into mongodb

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"`
}

user := User{Name: "username"}

client.Database("db").Collection("collection").InsertOne(context.Background(), user)

如何在golang中使用上面代码中的自动化created_at和updated_at以及mongodb(mongodb驱动程序)?目前它将为 created_at 和 updated_at.

设置零时间 (0001-01-01T00:00:00.000+00:00)

MongoDB 服务器不支持此功能。

您可以实施自定义封送拆收器,您可以在其中根据自己的喜好更新这些字段。实施 bson.Marshaler,当您保存 *User 类型的值时,您的 MarshalBSON() 函数将被调用。

这是它的样子:

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))
}

请注意该方法有指针接收器,因此请使用指向您的值的指针:

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


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

my类型的目的是避免堆栈溢出。