ホームページ >バックエンド開発 >Golang >Golang を使用して MongoDB の Created_at および Updated_at タイムスタンプを自動化する方法

Golang を使用して MongoDB の Created_at および Updated_at タイムスタンプを自動化する方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-06 13:17:111011ブラウズ

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
}

説明

元帥BSON関数は、created_at フィールドが空かどうかを確認し、空の場合は現在の時刻に設定します。次に、updated_at フィールドを現在時刻に設定します。型エイリアス (my) を使用し、User 構造体を *my にキャストすることで、マーシャリング プロセス中の潜在的なスタック オーバーフローを回避できます。

以上がGolang を使用して MongoDB の Created_at および Updated_at タイムスタンプを自動化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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