Maison >développement back-end >Golang >Comment remplir automatiquement les champs `created_at` et `updated_at` dans les structures Go avant l'insertion de MongoDB ?

Comment remplir automatiquement les champs `created_at` et `updated_at` dans les structures Go avant l'insertion de MongoDB ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-24 19:08:11189parcourir

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

Remplissage automatique de Created_at et Updated_at dans Go Struct avant l'insertion dans MongoDB

Lors de l'insertion d'une structure dans une collection MongoDB à l'aide du pilote MongoDB pour Go, les champs Created_at et Updated_at sont réglé à l'heure zéro (0001-01-01T00:00:00.000 00h00). Ce n'est peut-être pas le comportement souhaité, surtout si ces champs sont censés stocker l'heure réelle de création et de modification.

Maréchaleur personnalisé

Le serveur MongoDB ne prend pas en charge nativement le remplissage automatique de create_at et champs update_at. Cependant, vous pouvez implémenter cette fonctionnalité en créant un marshaler personnalisé.

Implémentation de bson.Marshaler

Implémentez l'interface bson.Marshaler pour votre type d'utilisateur. Cela vous permettra de personnaliser la façon dont la structure est marshalée dans BSON avant d'être insérée dans la base de données.

La méthode MarshalBSON de votre marshaleur personnalisé doit effectuer les étapes suivantes :

  1. If CreatedAt est zéro, réglez-le sur l'heure actuelle.
  2. Définissez UpdatedAt sur l'heure actuelle.
  3. Marshal la structure dans BSON à l'aide de la fonction de base bson.Marshal.

Voici un exemple de marshaleur personnalisé :

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))
}

Utilisation

Pour utiliser le marshaleur personnalisé , n'oubliez pas de l'utiliser partout où vous insérez une structure User dans la base de données à l'aide de la méthode InsertOne. Vous devez passer un pointeur vers la structure User en tant qu'argument.

Exemple :

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

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

Notez que le marshaleur personnalisé ne fonctionnera pas si vous l'intégrez dans une structure plus grande. Pour éviter ce problème, vous pouvez plutôt utiliser un marshaleur personnalisé pour l'intégralité de la structure intégrée.

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