首頁 >後端開發 >Golang >如何在 MongoDB 插入之前自動填入 Go 結構中的「created_at」和「updated_at」欄位?

如何在 MongoDB 插入之前自動填入 Go 結構中的「created_at」和「updated_at」欄位?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-24 19:08:11189瀏覽

How to Automatically Populate `created_at` and `updated_at` Fields in Go Structs Before MongoDB Insertion?

插入MongoDB 之前自動填入Go 結構體中的created_at 和updated_at

使用Go 的MongoDB 驅動程式將結構體插入MongoDB 欄位時,created_at 和為dated_at 字段為設定為零時間(0001-01-01T00:00:00.000 00:00)。這可能不是所需的行為,特別是如果這些欄位需要儲存建立和修改的​​實際時間。

自訂封送拆收器

MongoDB 伺服器本身不支援自動填入created_at 和Updated_at 欄位。但是,您可以透過建立自訂封送拆收器來實現此功能。

實作 bson.Marshaler

為您的 User 類型實作 bson.Marshaler 介面。這將允許您自訂結構在插入資料庫之前如何編組為 BSON。

自訂編組器的 MarshalBSON 方法應執行下列步驟:

  1. If CreatedAt為零,並將其設定為目前時間。
  2. 將 UpdatedAt 設定為目前時間time。
  3. 使用基本 bson.Marshal 函數將結構編組為 BSON。

以下是自訂編組器的範例:

func (user *User) MarshalBSON() ([]byte, error) {
    if user.CreatedAt.IsZero() {
        user.CreatedAt = time.Now()
    }
    user.UpdatedAt = time.Now()

    type my User
    return bson.Marshal((*my)(user))
}

用法

要使用自訂封送拆收器,請記得在將User結構插入到的任何位置都使用它使用InsertOne 方法插入資料庫。您必須將指向 User 結構的指標作為參數傳遞。

範例:

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

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

請注意,如果將自訂封送拆收器嵌入到更大的結構中,則自訂封送拆收器將無法運作。為了避免此問題,您可以對整個嵌入結構使用自訂封送拆收器。

以上是如何在 MongoDB 插入之前自動填入 Go 結構中的「created_at」和「updated_at」欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn