sql >> Base de Datos >  >> NoSQL >> MongoDB

Establezca la fecha predeterminada al insertar un documento con tiempo. Campo de tiempo

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 del User creación de valor de estructura y no cuando se guarda.

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 el mismo User instancia a guardar, solo su CreatedAt campo 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 un nuevo my el tipo se crea y se devuelve. La razón de esto es evitar el desbordamiento de la pila. Simplemente devolviendo un valor de tipo *User es malo, porque implementa bson.Getter , entonces GetBSON() sería llamado sin cesar. El nuevo my type no tiene este método, por lo que la "recursión" sin fin no ocurre (el type palabra clave 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 CreatedAt campo) incluso si solo desea volver a guardar un User . Entonces, deberíamos agregar una verificación si el CreatedAt el campo está lleno, y solo configúrelo 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