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

Adgang til MongoDB fra Go

Hvis du vil ændre en værdi eller lave en typekonvertering, når du rangerer/udskiller dine værdier fra / til MongoDB, kan du gøre det ved at implementere en brugerdefineret logik for rangering/unmarshaling.

Du kan gøre dette ved at implementere bson.Getter og bson.Setter grænseflader. Inde i disse metoder kan du gøre, hvad du vil med de værdier, der bliver marshaleret / unmarshaled.

Det nemmeste er at udvide din clientConfigData skriv med et ekstra felt, et der vil være af typen time.Time , den værdi, du har brug for:

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

Den har tagværdien bson:"-" , fordi vi ikke ønsker, at dette skal vises i MongoDB.

Og nu den brugerdefinerede marshaling / unmarhsaling logik:

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
}

Det, der sker her, er at SetBSON() er ansvarlig for at "udfylde" din strukturværdi med den rå værdi, der kommer fra MongoDB og GetBSON() er ansvarlig for at angive en værdi, du ønsker skal gemmes (marshaleret).

Ved indlæsning:SetBSON() ophæver først værdien som den er, og sætter derefter EndDate korrekt felt (som er af typen time.Time ) fra string datoværdi, der kom fra DB'en (EndDateStr ).

Ved lagring:GetBSON() udfylder først EndDateStr felt (det, der er gemt) fra EndDate felt, og returnerer så blot og signalerer, at det er ok at gemme.

En ting at bemærke:både SetBSON() og GetBSON() opret en ny my skriv i dem. Grunden til dette er at undgå stak overløb. Du skal blot returnere en værdi af typen clientConfigData er dårligt, fordi vi implementerede bson.Getter og bson.Setter , så SetBSON() og GetBSON() ville blive ringet op i det uendelige. Den nye my type har ikke disse metoder, så endeløs "rekursion" sker ikke (type søgeord opretter en ny type, og det "arver" ikke metoder af den underliggende type).

Se også relateret/lignende spørgsmål:Indstil standarddato ved indsættelse af dokument med time.Time field




  1. MongoDB Analytics-serien:SlamData – Kør SQL og byg rapporter direkte på MongoDB

  2. Mongoose JS findOne returnerer altid null

  3. Gruppér poster efter måned og tæl dem - Mongoose, nodeJs, mongoDb

  4. Stubbing Redis-interaktioner i javascript ved hjælp af Sinon