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

Legen Sie das Standarddatum beim Einfügen des Dokuments mit dem Feld time.Time fest

In Go können Sie keine Standardwerte für Felder definieren, sie sind immer der Nullwert ihres Typs, wenn ein neuer Strukturwert erstellt wird (es sei denn, Sie verwenden ein zusammengesetztes Literal, bei dem Sie explizit einen anderen Wert angeben können).

Eine Möglichkeit wäre also, eine Konstruktor-ähnliche Funktion NewUser() zu erstellen die dieses Feld setzen würden, und immer diese Funktion verwenden, um neue Benutzer anzulegen:

func NewUser() *User {
    return &User{
        CreatedAt: time.Now(),
    }
}

Dies kann natürlich nicht erzwungen werden und enthält auch den Zeitstempel des User struct Wertschöpfung und nicht beim Speichern.

Ein anderer, besserer Ansatz ist die Verwendung einer benutzerdefinierten Marshalling-Logik.

Sie können benutzerdefinierte Marshalling-Logik schreiben, indem Sie bson.Getter implementieren . GetBSON() ist dafür verantwortlich, einen Wert bereitzustellen, der tatsächlich gespeichert wird. Wir wollen denselben User zu speichernde Instanz, nur deren CreatedAt Feldsatz vor:

type User struct {
    CreatedAt time.Time `json:"created_at" bson:"created_at"`
}

func (u *User) GetBSON() (interface{}, error) {
    u.CreatedAt = time.Now()
    type my *User
    return my(u), nil
}

Beachten Sie, dass ein neuer my Typ wird erstellt und zurückgegeben. Der Grund dafür ist, einen Stapelüberlauf zu vermeiden. Einfach einen Wert vom Typ *User zurückgeben ist schlecht, weil es bson.Getter implementiert , also GetBSON() würde endlos angerufen werden. Das neue my type hat diese Methode nicht, also findet keine endlose "Rekursion" statt (der type -Schlüsselwort erstellt einen neuen Typ und "erbt" keine Methoden des zugrunde liegenden Typs).

Beachten Sie, dass diese Lösung auch CreatedAt überschreibt (zurücksetzt). Feld), auch wenn Sie nur einen User neu speichern möchten . Wir sollten also eine Prüfung hinzufügen, ob die CreatedAt Feld gefüllt ist, und setzen Sie es nur, wenn es der Wert Null ist:

func (u *User) GetBSON() (interface{}, error) {
    if u.CreatedAt.IsZero() {
        u.CreatedAt = time.Now()
    }
    type my *User
    return my(u), nil
}

Siehe auch verwandte / ähnliche Frage:Zugriff auf MongoDB von Go