MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Acessando o MongoDB de Go


Se você deseja alterar um valor ou fazer uma conversão de tipo ao realizar o marshaling/unmarshaling de seus valores de / para o MongoDB, você pode fazer isso implementando uma lógica de marshaling/unmarshaling personalizada.

Você pode fazer isso implementando o bson.Getter e bson.Setter interfaces. Dentro desses métodos, você pode fazer o que quiser com os valores sendo empacotados/desempacotados.

O mais fácil é estender seu clientConfigData digite com um campo adicional, que será do tipo time.Time , o valor que você precisa:
type clientConfigData struct {
    SMTPAssoc  int       `bson:"smtp_assoc"`
    PlanType   string    `bson:"plan_type"`
    EndDateStr string    `bson:"end_date"`
    EndDate    time.Time `bson:"-"`
}

Tem o valor da tag bson:"-" , porque não queremos que isso apareça no MongoDB.

E agora a lógica de marshaling/unmarhsaling personalizada:
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
}

O que acontece aqui é que SetBSON() é responsável por "preencher" seu valor struct com o valor bruto vindo do MongoDB e GetBSON() é responsável por fornecer um valor que você deseja que seja salvo (empacotado).

Ao carregar:SetBSON() primeiro desempacota o valor como está e, em seguida, define corretamente o EndDate campo (que é do tipo time.Time ) da string valor de data que veio do banco de dados (EndDateStr ).

Ao salvar:GetBSON() primeiro preenche o EndDateStr campo (o que é salvo) do EndDate campo e, em seguida, simplesmente retorna, sinalizando que está ok para salvar.

Uma coisa a notar:tanto SetBSON() e GetBSON() crie um novo my digite dentro deles. A razão para isso é evitar o estouro de pilha. Simplesmente retornando um valor do tipo clientConfigData é ruim, porque implementamos bson.Getter e bson.Setter , então SetBSON() e GetBSON() seria chamado sem parar. O novo my type não tem esses métodos, então a "recursão" infinita não acontece (o type palavra-chave cria um novo tipo e não "herda" métodos do tipo subjacente).

Veja também a pergunta relacionada/semelhante:Definir data padrão ao inserir documento com campo time.Time