_Primero: una solución para solucionar este problema: _
Model.findOne({id: 'blabla'}).select('email password createdAt').lean().exec()
Utilizo un campo createdAt
-que tiene un expira (TTL 24h
) y un valor predeterminado ( Date.now
)- en mi modelo Users
para almacenar la creación información de fecha de los nuevos usuarios creados.
Si el usuario activa la cuenta, el sistema elimina el campo createdAt
.
Si el usuario no activa la cuenta, el sistema elimina la cuenta de la colección Users
después de 24 horas.
En mis operaciones de autenticación, primero verifico el campo existente de createdAt
.
Si el usuario no está activado, muestro un mensaje como Account is not activated.
Cuando pruebo el método FindOne
para el procedimiento de autenticación anterior, obtengo el Date.now
aunque no hay un campo createdAt
en el documento porque el usuario ha activado su cuenta .
createdAt
campo en mi modelo User
:
createdAt: { type: Date, expires: '24h', default: Date.now },
Mi metodo:
Users.findOne({email: username}, 'email, password, createdAt', function(err, user) {
Al usar el método anterior, createdAt
valor devuelve en todo momento.
PD: busqué el problema pero no pude nada.
Así es como funcionan los valores predeterminados, cuando no hay un campo createdAt
en el documento, la mangosta agregará uno. Si solo desea agregar createdAt
al crear un nuevo documento:
schema.pre('save', function(next) {
if (this.isNew) {
this.createdAt = Date.now();
}
next();
});
Además, no recomendaría separar los campos en su proyección Users.findOne({email: username}, 'email, password, createdAt' /** <-- remove commas here */)
con comas.
Tropecé con el mismo problema.
@ vkarpov15 no debería funcionar de esa manera. Aunque el valor predeterminado está configurado para guardar, es engañoso establecerlo cuando find
el documento, porque en realidad debería devolver los datos exactos almacenados en la base de datos, ¿no es así? Votaría a favor de reabrir el tema.
No necesariamente, mangosta tiene muchos lugares donde el documento no representa los datos exactos almacenados en la base de datos: getters, virtuales, etc. De cualquier manera, afirmamos este comportamiento y cambiarlo rompería el código de muchas personas, por lo que no lo cambiaremos a menos que haya mucha demanda para cambiarlo. Aquí tienes una solución alternativa:
createdAt: {
type: Date,
default: function() {
if (this.isNew) { return new Date(); }
return undefined;
}
}
Esto hará que createdAt
solo se establezca al guardar en la base de datos, pero será undefined
si cargó un documento desde la base de datos y createdAt
no colocar.
Comentario más útil
Tropecé con el mismo problema.
@ vkarpov15 no debería funcionar de esa manera. Aunque el valor predeterminado está configurado para guardar, es engañoso establecerlo cuando
find
el documento, porque en realidad debería devolver los datos exactos almacenados en la base de datos, ¿no es así? Votaría a favor de reabrir el tema.