sql >> Database >  >> NoSQL >> MongoDB

Stel de standaarddatum in bij het invoegen van een document met tijd. Veld Tijd

In Go kun je geen standaardwaarden voor velden definiëren, ze zullen altijd de nulwaarde van hun type zijn wanneer een nieuwe structwaarde wordt gemaakt (tenzij je een samengestelde letterlijke waarde gebruikt waar je expliciet een andere waarde kunt geven).

Dus een optie zou zijn om een ​​constructor-achtige functie te maken NewUser() die dit veld zou instellen, en altijd deze functie gebruiken om nieuwe gebruikers aan te maken:

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

Dit kan natuurlijk niet worden geforceerd, en dit zal ook de tijdstempel van de User bevatten struct waardecreatie en niet wanneer het wordt opgeslagen.

Een andere, betere benadering is om een ​​aangepaste marshaling-logica te gebruiken.

U kunt aangepaste marshaling-logica schrijven door bson.Getter . te implementeren . GetBSON() is verantwoordelijk voor het leveren van een waarde die daadwerkelijk wordt bespaard. We willen dezelfde User instantie die moet worden opgeslagen, alleen de CreatedAt veld eerder ingesteld:

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
}

Merk op dat een nieuwe my type wordt gemaakt en geretourneerd. De reden hiervoor is om stack overflow te voorkomen. Gewoon een waarde van het type *User returning retourneren is slecht, omdat het bson.Getter . implementeert , dus GetBSON() eindeloos zou worden gebeld. De nieuwe my type heeft deze methode niet, dus eindeloze "recursie" gebeurt niet (het type trefwoord maakt een nieuw type aan en het "erft" geen methoden van het onderliggende type).

Merk op dat deze oplossing ook de CreatedAt . zal overschrijven (opnieuw instellen) veld) zelfs als u alleen een User opnieuw wilt opslaan . We moeten dus een controle toevoegen of de CreatedAt veld is gevuld en stel het alleen in als het de nulwaarde is:

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

Zie ook gerelateerde/vergelijkbare vraag:MongoDB openen vanuit Go




  1. Hoe wordt MongoDb geïnstalleerd door Meteor?

  2. Bestand doorgeven aan actieve taak / achtergrondtaak

  3. Mongo Change Streams die meerdere keren worden uitgevoerd (soort van):Node-app die meerdere instanties uitvoert

  4. PHP Mongo Fout bij lezen van socket