Je sais qu'il ne devrait pas y avoir de validation sur la mise à jour du champ, mais elle s'exécute quand même lorsque j'essaye de migrer une base de données.
Fait partie de la migration:
email: { type: String, validate: { validator: email => User.doesntExist({ email }), message: ({ value }) => `Email ${value} has already been taken` } }
Une partie du schéma:
const arr = await User.find({ ban: { $exists: true } }); arr.forEach(async item => { // this works // await User.updateOne({ _id: item._id }, { ban: false }); // this doesn't item.ban = false; await item.save(); });
"ValidationError: La validation de l'utilisateur a échoué: email: Email guest1@ex.com a déjà été pris"
3 Réponses :
https://mongoosejs.com/docs/validation.html#validation
La validation est un middleware. Mongoose enregistre la validation en tant que hook de pré ('save') sur chaque schéma par défaut.
updateOne ne déclenche pas la sauvegarde du hook.
mongoosejs.com/docs/documents.html#updating doc.save fonctionne comme updateOne et ne déclenche pas le pré ('save')
Vous le faites correctement, car comme signalé dans la documentation de mangouste :
La fonction save () est généralement la bonne façon de mettre à jour un document avec Mongoose. Avec save (), vous obtenez une validation complète et un middleware.
Mais, lorsque vous appelez la fonction .save ()
, tous les validateurs sont appelés, y compris votre validateur de messagerie utilisateur:
validator: email => User.doesntExist({ email })
Et dans votre cas, c'est un problème, car l'utilisateur en cours de validation est déjà enregistré dans la base de données ... Donc, pour éviter cela, vous devez utiliser le . update () pour mettre à jour vos utilisateurs.
Il existe une option pour désactiver le validateur à déclencher dans mangouste save ()
, qui est validateBeforeSave
. (depuis la version 4.4.2 de la mangouste)
Essayez donc d'utiliser save ({validateBeforeSave: false})
si vous souhaitez continuer à utiliser save ()
au lieu de update ()
.