Maison >développement back-end >Golang >Comment automatiser les horodatages Created_at et Updated_at dans MongoDB à l'aide de Golang ?

Comment automatiser les horodatages Created_at et Updated_at dans MongoDB à l'aide de Golang ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-06 13:17:111015parcourir

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

Automatisation des champs Created_at et Updated_at dans MongoDB avec Golang

Dans l'extrait de code fourni, la structure utilisateur manque d'automatisation pour les champs create_at et update_at . Ces champs sont cruciaux pour le suivi des événements temporels.

Solution

Le serveur MongoDB ne prend pas en charge le remplissage automatisé des champs. Pour y parvenir, vous pouvez implémenter une fonction de marshaling personnalisée pour la structure User. En implémentant l'interface bson.Marshaler, vous pouvez contrôler la manière dont la structure est sérialisée dans BSON.

Implémentation

Voici comment implémenter la fonction 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))
}

Vous devez noter que la fonction MarshalBSON dispose d'un récepteur pointeur, et vous devez utiliser un pointeur vers votre Valeur utilisateur lors du marshaling.

Utilisation

Après avoir implémenté la fonction de marshaling personnalisée, vous pouvez l'utiliser comme ceci :

client := mongo.NewClient(...) // (redacted for brevity)

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

Explication

La fonction MarshalBSON vérifie si le champ créé_at est vide et le définit sur le l'heure actuelle si c'est le cas. Il définit ensuite le champ update_at sur l'heure actuelle. En utilisant un alias de type (my) et en convertissant la structure User en *my, vous évitez un potentiel débordement de pile pendant le processus de marshalling.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn