Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

169
Visualizações
Establezca la fecha predeterminada al insertar un documento con tiempo. Campo de tiempo

En mongoose ( node.js ) puedo definir un esquema de modelo con una fecha predeterminada Date.now así:

 ... type: Date, default: Date.now ...

¿Cómo logro lo mismo sin tener que insertar el time.Time cada vez que creo un documento con mgo ?

 type User struct { CreatedAt time.Time `json:"created_at" bson:"created_at"` // Make this field filled automatically with time.Now() every time a document of this `struct` is inserted }
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

En Go no puede definir valores predeterminados para los campos, siempre serán el valor cero de su tipo cuando se crea un nuevo valor de estructura (a menos que use un literal compuesto donde pueda dar un valor diferente explícitamente).

Entonces, una opción sería crear una función similar a un constructor NewUser() que establecería este campo y usaría siempre esta función para crear nuevos usuarios:

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

Por supuesto, esto no se puede forzar, y también mantendrá la marca de tiempo de la creación del valor de la estructura del User y no cuando se guarde.

Otro enfoque mejor es utilizar una lógica de serialización personalizada.

Puede escribir una lógica de serialización personalizada implementando bson.Getter . GetBSON() es responsable de proporcionar un valor que realmente se guardará. Queremos que se guarde la misma instancia de User , solo su campo CreatedAt en establecido antes:

 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 }

Tenga en cuenta que se crea y se devuelve un nuevo tipo my . La razón de esto es evitar el desbordamiento de la pila. Simplemente devolver un valor de tipo *User es malo, porque implementa bson.Getter , por lo que GetBSON() se llamaría sin cesar. El nuevo tipo my no tiene este método, por lo que no se produce una "recursión" interminable (la palabra clave type crea un nuevo tipo y no "hereda" los métodos del tipo subyacente).

Tenga en cuenta que esta solución también sobrescribirá (reestablecerá) el campo CreatedAt ) incluso si solo desea volver a guardar un User . Entonces, deberíamos agregar una verificación si el campo CreatedAt está lleno, y solo configurarlo si es el valor cero:

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

Consulte también una pregunta relacionada/similar: Acceso a MongoDB desde Go

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda