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!