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

Accéder à MongoDB depuis Go

Si vous souhaitez modifier une valeur ou effectuer une conversion de type lors du marshaling/unmarshaling de vos valeurs de/vers MongoDB, vous pouvez le faire en implémentant une logique de marshaling/unmarshaling personnalisée.

Vous pouvez le faire en implémentant le bson.Getter et bson.Setter interfaces. À l'intérieur de ces méthodes, vous pouvez faire ce que vous voulez avec les valeurs marshalées / non marshalées.

Le plus simple est d'étendre votre clientConfigData tapez avec un champ supplémentaire, celui qui sera de type time.Time , la valeur dont vous avez besoin :

type clientConfigData struct {
    SMTPAssoc  int       `bson:"smtp_assoc"`
    PlanType   string    `bson:"plan_type"`
    EndDateStr string    `bson:"end_date"`
    EndDate    time.Time `bson:"-"`
}

Il a la valeur de balise bson:"-" , car nous ne voulons pas que cela apparaisse dans MongoDB.

Et maintenant la logique personnalisée de marshaling/unmarhsaling :

const endDateLayout = "2006-01-02 15:04:05" // Use your layout here

func (c *clientConfigData) SetBSON(raw bson.Raw) (err error) {
    type my clientConfigData
    if err = raw.Unmarshal((*my)(c)); err != nil {
        return
    }
    c.EndDate, err = time.Parse(endDateLayout, c.EndDateStr)
    return
}

func (c *clientConfigData) GetBSON() (interface{}, error) {
    c.EndDateStr = c.EndDate.Format(endDateLayout)
    type my *clientConfigData
    return my(c), nil
}

Ce qui se passe ici est que SetBSON() est responsable de "remplir" votre valeur de structure avec la valeur brute provenant de MongoDB, et GetBSON() est chargé de fournir une valeur que vous souhaitez enregistrer (marshaled).

Lors du chargement :SetBSON() commence par démarshaler la valeur telle quelle, puis définit correctement la EndDate champ (qui est de type time.Time ) à partir de la string valeur de date provenant de la base de données (EndDateStr ).

Lors de l'enregistrement :GetBSON() remplit d'abord le EndDateStr champ (celui qui est enregistré) de la EndDate champ, puis revient simplement, signalant que vous pouvez enregistrer.

Une chose à noter :à la fois SetBSON() et GetBSON() créer un nouveau my tapez à l'intérieur d'eux. La raison en est d'éviter le débordement de pile. Renvoyer simplement une valeur de type clientConfigData est mauvais, car nous avons implémenté bson.Getter et bson.Setter , donc SetBSON() et GetBSON() serait appelé sans fin. Le nouveau my type n'a pas ces méthodes, 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).

Voir également la question connexe / similaire :Définir la date par défaut lors de l'insertion d'un document avec le champ heure.Heure