英文:
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)
在上述代码中,我们在CreatedAt
和UpdatedAt
字段的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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论