ホームページ >バックエンド開発 >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 フィールドと updated_at フィールドは次のようになります。ゼロ時間に設定 (0001-01-01T00:00:00.000) 00:00)。これは、特にこれらのフィールドに作成と変更の実際の時刻を保存することが想定されている場合には、望ましい動作ではない可能性があります。

カスタム マーシャラー

MongoDB サーバーは、created_at とupdated_at フィールド。ただし、カスタム マーシャラーを作成することでこの機能を実装できます。

bson.Marshaler の実装

ユーザー タイプに 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。