Mongoose: FindOne devuelve el valor predeterminado del archivo inexistente.

Creado en 23 jul. 2016  ·  3Comentarios  ·  Fuente: Automattic/mongoose

_Primero: una solución para solucionar este problema: _
Model.findOne({id: 'blabla'}).select('email password createdAt').lean().exec()

asunto:

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.

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.

Todos 3 comentarios

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.

¿Fue útil esta página
0 / 5 - 0 calificaciones