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

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

Linda Hamilton
发布: 2024-12-06 13:17:11
原创
1090 人浏览过

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 函数:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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 值的指针。

用法

实现自定义封送功能后,您可以像这样使用它:

1

2

3

4

5

6

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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板