sql >> Database >  >> NoSQL >> MongoDB

MongoDB openen vanuit Go

Als u een waarde wilt wijzigen of een typeconversie wilt uitvoeren wanneer u uw waarden van / naar MongoDB rangschikt / unmarsharingt, kunt u dit doen door een aangepaste logica voor marshaling / unmarshaling te implementeren.

U kunt dit doen door de bson.Getter . te implementeren en bson.Setter interfaces. Binnen deze methoden kun je doen wat je wilt met de waarden die worden gemarshald / unmarshaled.

Het eenvoudigst is om uw clientConfigData uit te breiden type met een extra veld, een van het type time.Time , de waarde die je nodig hebt:

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

Het heeft de tagwaarde bson:"-" , omdat we niet willen dat dit in MongoDB verschijnt.

En nu de aangepaste marshaling / unmarhsaling-logica:

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
}

Wat hier gebeurt, is dat SetBSON() is verantwoordelijk voor het "vullen" van uw struct-waarde met de onbewerkte waarde afkomstig van MongoDB, en GetBSON() is verantwoordelijk voor het verstrekken van een waarde die u wilt behouden (gerangschikt).

Bij het laden:SetBSON() unmarshal eerst de waarde zoals hij is en stelt vervolgens de EndDate correct in veld (van het type time.Time ) uit de string datumwaarde die uit de DB kwam (EndDateStr ).

Bij opslaan:GetBSON() vult eerst de EndDateStr veld (degene die wordt opgeslagen) van de EndDate veld, en keert dan gewoon terug, om aan te geven dat het ok is om op te slaan.

Een ding om op te merken:beide SetBSON() en GetBSON() maak een nieuwe my . aan typ erin. De reden hiervoor is om stack overflow te voorkomen. Gewoon een waarde teruggeven van het type clientConfigData is slecht, omdat we bson.Getter . hebben geïmplementeerd en bson.Setter , dus SetBSON() en GetBSON() eindeloos zou worden gebeld. De nieuwe my type heeft deze methoden niet, dus eindeloze "recursie" gebeurt niet (het type trefwoord maakt een nieuw type aan en het "erft" geen methoden van het onderliggende type).

Zie ook verwante/vergelijkbare vraag:Standaarddatum instellen bij het invoegen van document met tijd. Veld Tijd




  1. Verwijder mongoDB van ubuntu

  2. Gegevensmigraties met Redis

  3. Manieren om gegevensversiebeheer in MongoDB te implementeren

  4. Hoe mongodb-clients te verbinden met lokale Meteor MongoDB