MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Zugriff auf MongoDB von Go

Wenn Sie beim Marshallen/Unmarshaling Ihrer Werte von / nach MongoDB einen Wert ändern oder eine Typkonvertierung durchführen möchten, können Sie dies tun, indem Sie eine benutzerdefinierte Marshalling-/Unmarshaling-Logik implementieren.

Sie können dies tun, indem Sie den bson.Getter implementieren und bson.Setter Schnittstellen. Innerhalb dieser Methoden können Sie mit den gemarshallten/unmarshallten Werten machen, was Sie wollen.

Am einfachsten ist es, Ihre clientConfigData zu erweitern type mit einem zusätzlichen Feld, eines vom Typ time.Time , der benötigte Wert:

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

Es hat den Tag-Wert bson:"-" , da wir nicht möchten, dass dies in MongoDB erscheint.

Und jetzt die benutzerdefinierte Marshalling/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
}

Was hier passiert, ist das SetBSON() ist dafür verantwortlich, Ihren Strukturwert mit dem Rohwert aus MongoDB und GetBSON() zu "füllen". ist dafür verantwortlich, einen Wert bereitzustellen, den Sie speichern (gemarshallt) möchten.

Beim Laden:SetBSON() entpackt zuerst den Wert so, wie er ist, und legt dann das EndDate richtig fest Feld (das vom Typ time.Time ist ) aus der string Datumswert, der aus der DB kam (EndDateStr ).

Beim Speichern:GetBSON() füllt zuerst den EndDateStr Feld (dasjenige, das gespeichert wird) vom EndDate Feld und kehrt dann einfach zurück und signalisiert, dass es in Ordnung ist zu speichern.

Eine Sache zu beachten:beide SetBSON() und GetBSON() Erstellen Sie ein neues my Geben Sie sie ein. Der Grund dafür ist, einen Stapelüberlauf zu vermeiden. Einfach einen Wert vom Typ clientConfigData zurückgeben ist schlecht, weil wir bson.Getter implementiert haben und bson.Setter , also SetBSON() und GetBSON() würde endlos angerufen werden. Das neue my type hat diese Methoden nicht, also findet keine endlose "Rekursion" statt (der type -Schlüsselwort erstellt einen neuen Typ und "erbt" keine Methoden des zugrunde liegenden Typs).

Siehe auch verwandte / ähnliche Frage:Standarddatum beim Einfügen von Dokumenten mit Zeit festlegen.Zeitfeld