Autofill created_at and updated_at in golang struct while pushing into mongodb

huangapple go评论99阅读模式
英文:

Autofill created_at and updated_at in golang struct while pushing into mongodb

问题

在上述代码中如何在使用golang的mongodb驱动程序中自动设置created_at和updated_at?当前它会将created_at和updated_at设置为零时间(0001-01-01T00:00:00.000+00:00)。

你可以通过在结构体中定义created_at和updated_at字段的默认值来实现自动设置。在这种情况下,你可以使用time.Now()函数来获取当前时间作为默认值。

以下是修改后的代码示例:

type User struct {
	ID        primitive.ObjectID `bson:"_id,omitempty"`
	CreatedAt time.Time          `bson:"created_at,default"`
	UpdatedAt time.Time          `bson:"updated_at,default"`
	Name      string             `bson:"name"`
}

user := User{Name: "username"}

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

在上述代码中,我们在CreatedAtUpdatedAt字段的bson标签中添加了default选项。这将告诉MongoDB驱动程序在插入文档时使用默认值。

请注意,这种方法只适用于MongoDB驱动程序。如果你使用其他ORM或库,可能需要查阅其文档以了解如何自动设置默认值。

英文:
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)

How to use automated created_at and updated_at in the above code with mongodb(mongodb driver only) in golang? Currently it will set zero time(0001-01-01T00:00:00.000+00:00) for created_at and updated_at.

答案1

得分: 6

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 {
    // 处理错误
}

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

英文:

The MongoDB server does not support this.

You may implement a custom marshaler in which you may update these fields to your liking. Implement bson.Marshaler, and your MarshalBSON() function will be called when you save values of your *User type.

This is how it would look like:

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

Note the method has pointer receiver, so use a pointer to your value:

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


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

The purpose of the my type is to avoid stack overflow.

huangapple
  • 本文由 发表于 2022年4月17日 21:52:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/71902455.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定