sql >> Databasteknik >  >> NoSQL >> MongoDB

Åtkomst till MongoDB från Go

Om du vill ändra ett värde eller göra en typkonvertering när du sorterar / delar upp dina värden från / till MongoDB, kan du göra det genom att implementera en anpassad logik för rangering / unmarshaling.

Du kan göra detta genom att implementera bson.Getter och bson.Setter gränssnitt. Inom de här metoderna kan du göra vad du vill med de värden som raderas/avgränsas.

Enklast är att utöka din clientConfigData skriv med ett extra fält, ett som kommer att vara av typen time.Time , värdet du behöver:

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

Den har taggvärdet bson:"-" , eftersom vi inte vill att detta ska visas i MongoDB.

Och nu den anpassade logiken för marshaling / unmarhsaling:

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 som händer här är att SetBSON() är ansvarig för att "fylla" ditt strukturvärde med råvärdet som kommer från MongoDB och GetBSON() är ansvarig för att tillhandahålla ett värde som du vill ska sparas (marshaleras).

Vid laddning:SetBSON() avmarkerar först värdet som det är och ställer sedan in EndDate korrekt fältet (som är av typen time.Time ) från string datumvärde som kom från DB (EndDateStr ).

När du sparar:GetBSON() först fyller EndDateStr fältet (det som sparas) från EndDate fältet och returnerar sedan helt enkelt, vilket signalerar att det är ok att spara.

En sak att notera:båda SetBSON() och GetBSON() skapa en ny my skriv i dem. Anledningen till detta är att undvika stackspill. Returnerar helt enkelt ett värde av typen clientConfigData är dåligt eftersom vi implementerade bson.Getter och bson.Setter , alltså SetBSON() och GetBSON() skulle bli uppringd oändligt. Den nya my typ har inte dessa metoder, så oändlig "rekursion" inträffar inte (type nyckelordet skapar en ny typ och det "ärver" inte metoder av den underliggande typen).

Se även relaterad / liknande fråga:Ställ in standarddatum när du infogar dokument med time.Time field




  1. resque-scheduler misslyckas vid borttagning av jobb

  2. doRedis med konstigt socket-anslutningsfel i Ubuntu Linux, R och RStudio

  3. Hur tar man tillbaka borttaget utrymme utan `db.repairDatabase()`?

  4. Uppdaterar kapslade arrayer i mongodb