MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Définir la date par défaut lors de l'insertion d'un document avec le champ time.Time

Dans Go, vous ne pouvez pas définir de valeurs par défaut pour les champs, ils seront toujours la valeur zéro de leur type lorsqu'une nouvelle valeur de structure est créée (sauf si vous utilisez un littéral composite où vous pouvez donner explicitement une valeur différente).

Donc, une option serait de créer une fonction de type constructeur NewUser() qui définirait ce champ, et utiliserait toujours cette fonction pour créer de nouveaux utilisateurs :

func NewUser() *User {
    return &User{
        CreatedAt: time.Now(),
    }
}

Bien sûr, cela ne peut pas être forcé, et cela contiendra également l'horodatage de l'User création de valeur de structure et non lors de son enregistrement.

Une autre meilleure approche consiste à utiliser une logique de marshaling personnalisée.

Vous pouvez écrire une logique de marshaling personnalisée en implémentant bson.Getter . GetBSON() est chargé de fournir une valeur qui sera effectivement sauvegardée. Nous voulons le même User instance à enregistrer, juste son CreatedAt champ défini avant :

type User struct {
    CreatedAt time.Time `json:"created_at" bson:"created_at"`
}

func (u *User) GetBSON() (interface{}, error) {
    u.CreatedAt = time.Now()
    type my *User
    return my(u), nil
}

Notez qu'un nouveau my type est créé et renvoyé. La raison en est d'éviter le débordement de pile. Renvoyer simplement une valeur de type *User est mauvais, car il implémente bson.Getter , donc GetBSON() serait appelé sans fin. Le nouveau my type n'a pas cette méthode, donc la "récursivité" sans fin ne se produit pas (le type mot-clé crée un nouveau type, et il "n'hérite" pas des méthodes du type sous-jacent).

Notez que cette solution écrasera (réinitialisera) également le CreatedAt champ) même si vous souhaitez simplement ré-enregistrer un User . Nous devons donc ajouter une vérification si le CreatedAt champ est rempli et ne le définissez que s'il s'agit de la valeur zéro :

func (u *User) GetBSON() (interface{}, error) {
    if u.CreatedAt.IsZero() {
        u.CreatedAt = time.Now()
    }
    type my *User
    return my(u), nil
}

Voir également la question connexe/similaire :Accéder à MongoDB depuis Go