Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

163
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda