首页 >后端开发 >Golang >如何使用 Golang 在 MongoDB 中自动创建 Created_at 和 Updated_at 时间戳?

如何使用 Golang 在 MongoDB 中自动创建 Created_at 和 Updated_at 时间戳?

Linda Hamilton
Linda Hamilton原创
2024-12-06 13:17:111015浏览

How to Automate Created_at and Updated_at Timestamps in MongoDB using Golang?

使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn