sql >> Base de Datos >  >> NoSQL >> MongoDB

Accediendo a MongoDB desde Go

Si desea cambiar un valor o realizar una conversión de tipo al clasificar/desclasificar sus valores de/a MongoDB, puede hacerlo implementando una lógica personalizada de clasificación/desclasificación.

Puede hacer esto implementando el bson.Getter y bson.Setter interfaces Dentro de estos métodos, puede hacer lo que quiera con los valores que se calculan o no.

Lo más fácil es extender su clientConfigData type con un campo adicional, uno que será del tipo time.Time , el valor que necesita:

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

Tiene valor de etiqueta bson:"-" , porque no queremos que esto aparezca en MongoDB.

Y ahora la lógica personalizada de serialización/desmarhsaling:

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
}

Lo que sucede aquí es que SetBSON() es responsable de "rellenar" el valor de su estructura con el valor bruto procedente de MongoDB y GetBSON() es responsable de proporcionar un valor que desea que se guarde (marshaled).

Al cargar:SetBSON() primero desarma el valor tal como está, luego establece correctamente la EndDate campo (que es de tipo time.Time ) de la string valor de fecha que vino de la base de datos (EndDateStr ).

Al guardar:GetBSON() primero llena el EndDateStr campo (el que se guarda) del EndDate y luego simplemente regresa, lo que indica que está bien guardar.

Una cosa a tener en cuenta:ambos SetBSON() y GetBSON() crear un nuevo my escriba dentro de ellos. La razón de esto es evitar el desbordamiento de la pila. Simplemente devolviendo un valor de tipo clientConfigData es malo, porque implementamos bson.Getter y bson.Setter , entonces SetBSON() y GetBSON() sería llamado sin cesar. El nuevo my type no tiene estos métodos, por lo que la "recursión" sin fin no ocurre (el type palabra clave crea un nuevo tipo y no "hereda" los métodos del tipo subyacente).

Consulte también una pregunta relacionada/similar:Establecer fecha predeterminada al insertar un documento con la hora. Campo de hora