MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Accesso a MongoDB da Go

Se desideri modificare un valore o eseguire una conversione di tipo durante il marshalling/unmarshalling dei tuoi valori da/a MongoDB, puoi farlo implementando una logica di marshalling/unmarshalling personalizzata.

Puoi farlo implementando il bson.Getter e bson.Setter interfacce. All'interno di questi metodi, puoi fare tutto ciò che vuoi con i valori sottoposti a marshalling/non marshalling.

La cosa più semplice è estendere i tuoi clientConfigData digitare con un campo aggiuntivo, che sarà di tipo time.Time , il valore che ti serve:

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

Ha il valore del tag bson:"-" , perché non vogliamo che appaia in MongoDB.

E ora la logica di marshalling/unmarhsaling personalizzata:

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
}

Quello che succede qui è che SetBSON() è responsabile di "popolare" il tuo valore struct con il valore grezzo proveniente da MongoDB e GetBSON() è responsabile di fornire un valore che desideri venga salvato (marshalling).

Durante il caricamento:SetBSON() prima annulla il marshalling del valore così com'è, quindi imposta correttamente EndDate campo (che è di tipo time.Time ) dalla string valore della data proveniente dal database (EndDateStr ).

Durante il salvataggio:GetBSON() prima riempie EndDateStr campo (quello che viene salvato) dal EndDate campo, quindi ritorna semplicemente, segnalando che è possibile salvare.

Una cosa da notare:entrambi SetBSON() e GetBSON() crea un nuovo my digita al loro interno. Il motivo è evitare l'overflow dello stack. Semplicemente restituendo un valore di tipo clientConfigData è negativo, perché abbiamo implementato bson.Getter e bson.Setter , quindi SetBSON() e GetBSON() verrebbe chiamato all'infinito. Il nuovo my type non ha questi metodi, quindi non si verifica una "ricorsività" infinita (il type la parola chiave crea un nuovo tipo e non "eredita" i metodi del tipo sottostante).

Vedi anche domanda correlata/simile:imposta la data predefinita quando inserisci il documento con l'ora. Campo ora