MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Dostęp do MongoDB z Go

Jeśli chcesz zmienić wartość lub przeprowadzić konwersję typu podczas kierowania/odprowadzania wartości z/do MongoDB, możesz to zrobić, implementując niestandardową logikę kierowania/odprowadzania.

Możesz to zrobić, implementując bson.Getter i bson.Setter interfejsy. Wewnątrz tych metod możesz robić, co chcesz, z wartościami, które są gromadzone / przekazywane.

Najłatwiej jest rozszerzyć swoje clientConfigData wpisz z dodatkowym polem, które będzie typu time.Time , potrzebna wartość:

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

Ma wartość tagu bson:"-" , ponieważ nie chcemy, aby pojawiło się to w MongoDB.

A teraz niestandardowa logika marshalingu / unmarhsalingu:

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
}

Dzieje się tak, że SetBSON() jest odpowiedzialny za „wypełnienie” wartości struktury surową wartością pochodzącą z MongoDB i GetBSON() jest odpowiedzialny za dostarczenie wartości, którą chcesz zapisać (zorganizować).

Podczas ładowania:SetBSON() najpierw rozpakowuje wartość bez zmian, a następnie odpowiednio ustawia EndDate pole (które jest typu time.Time ) z string wartość daty pochodząca z bazy danych (EndDateStr ).

Podczas zapisywania:GetBSON() najpierw wypełnia EndDateStr pole (to, które jest zapisane) z EndDate pole, a następnie po prostu wraca, sygnalizując, że można zapisać.

Jedna rzecz do zapamiętania:zarówno SetBSON() i GetBSON() utwórz nowy my wpisz w nich. Powodem tego jest uniknięcie przepełnienia stosu. Po prostu zwracam wartość typu clientConfigData jest złe, ponieważ zaimplementowaliśmy bson.Getter i bson.Setter , więc SetBSON() i GetBSON() zostanie wywołany bez końca. Nowy my type nie ma tych metod, więc nie ma niekończącej się "rekursji" (type słowo kluczowe tworzy nowy typ i nie „dziedziczy” metod typu bazowego).

Zobacz także powiązane / podobne pytanie:Ustaw domyślną datę podczas wstawiania dokumentu z czasem.Pole czasu




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak zaktualizować pola dokumentów MongoDB tylko wtedy, gdy nie istnieją?

  2. MongoDB dodaje się do pola kolekcji łączącej z bazy jeden

  3. 2 sposoby na zastąpienie podciągu w MongoDB

  4. Jak uruchomić mongo db w systemie Windows

  5. Jak ponownie wykorzystać połączenie mongodb za pośrednictwem Promise