sql >> Databáze >  >> NoSQL >> MongoDB

Přístup k MongoDB z Go

Pokud chcete změnit hodnotu nebo provést konverzi typu při zařazování / zrušení zařazování vašich hodnot z / do MongoDB, můžete to udělat implementací vlastní logiky zařazování / rozřazování.

Můžete to udělat implementací bson.Getter a bson.Setter rozhraní. Uvnitř těchto metod můžete s hodnotami, které jsou zařazeny / unmarshaled, dělat, co chcete.

Nejjednodušší je rozšířit vaše clientConfigData zadejte s dalším polem, které bude typu time.Time , hodnotu, kterou potřebujete:

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

Má hodnotu značky bson:"-" , protože nechceme, aby se to objevilo v MongoDB.

A nyní vlastní logika zařazování / rozpojování:

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
}

Zde se stane, že SetBSON() je zodpovědný za „vyplnění“ vaší hodnoty struct nezpracovanou hodnotou pocházející z MongoDB a GetBSON() je odpovědný za poskytnutí hodnoty, kterou chcete uložit (zařazenou).

Při načítání:SetBSON() nejprve zruší hodnotu tak, jak je, a poté správně nastaví EndDate pole (které je typu time.Time ) z string hodnota data, která přišla z databáze (EndDateStr ).

Při ukládání:GetBSON() nejprve vyplní EndDateStr pole (to, které je uloženo) z EndDate pole a poté se jednoduše vrátí, což signalizuje, že je v pořádku uložit.

Jedna věc, kterou je třeba poznamenat:obě SetBSON() a GetBSON() vytvořit nový my zadejte do nich. Důvodem je zabránit přetečení zásobníku. Jednoduše vrátí hodnotu typu clientConfigData je špatné, protože jsme implementovali bson.Getter a bson.Setter , takže SetBSON() a GetBSON() by byl volán donekonečna. Nový my type tyto metody nemá, takže nedochází k nekonečné "rekurzi" (type klíčové slovo vytváří nový typ a „nedědí“ metody základního typu).

Viz také související / podobná otázka:Nastavte výchozí datum při vkládání dokumentu s polem time.Time




  1. Nasazování aplikací na CDP Operational Database (COD)

  2. Redis Out of Memory Výjimky, ale stále mají dostatek paměti

  3. Převod jednoduché databáze MySQL na řešení NoSQL

  4. Jak funguje mechanismus předplatného Redis PubSub?