Mongoose: schema.pre('save') non déclenché par MyModel.update()

Créé le 16 juil. 2011  ·  11Commentaires  ·  Source: Automattic/mongoose

exemple.js :

var mongoose = require('mongoose')
  , Schema = mongoose.Schema

mongoose.connect('mongodb://localhost/test')

var Thing = new Schema({
  title : String,
  content : String
})

Thing.pre('save', function(next){
  console.log("saving: %s (%s)", this.title, this.content)
  next()
})

var MyThing = mongoose.model('Thing', Thing)

var example = new MyThing({
  title : 'foo',
  content : 'bar'
})

example.save(function(err){
  MyThing.update({title:'foo'},{content:'baz'}, function(err, rs){
    console.log(rs)
  })  
})

Sortir:

$ node example.js 
saving: foo (bar)
1

Le pré est déclenché par la sauvegarde initiale, mais pas par la mise à jour.

Commentaire le plus utile

Ce n'est pas un bug. pre save est un hook qui se déclenche sur les instances lorsque leur méthode de sauvegarde est appelée, et non sur le modèle lorsque update est appelé.

Model.update vous permet d'envoyer des opérations $set atomiques directement à mongodb.

Tous les 11 commentaires

Ce n'est pas un bug. pre save est un hook qui se déclenche sur les instances lorsque leur méthode de sauvegarde est appelée, et non sur le modèle lorsque update est appelé.

Model.update vous permet d'envoyer des opérations $set atomiques directement à mongodb.

C'est une fonctionnalité que j'aimerais avoir ; particulièrement utile lors de la sauvegarde de données éparses.

@aheckman Je suis d'accord avec @martindale , je pense que dans les interfaces utilisateur où nous avons des mises à jour de formulaire $.ajax , par exemple en passant un req.body._id à un itinéraire de publication, un type de pré-méthode serait pratique. Un exemple de cas d'utilisation est lorsque vous soumettez deux nombres et que vous souhaitez que le modèle ait un pre('save') pour calculer le total.

peut-être pre('update') ofc

J'ai également remarqué cela, donc je suppose que ce n'est pas considéré comme une amélioration qui vaut la peine d'être ajoutée.

J'ai décidé d'utiliser l'approche d'Aheckmann où je dois mettre à jour le champ de date updatedOn mon objet. Cependant, là où l'audit est quelque chose que j'aimerais utiliser au niveau du middleware, cette approche sent mauvais.

La définition d'une date dans mon cas est très sensible à l'instant où la sauvegarde s'engage dans mongodb, car j'ai un processus en arrière-plan chargeant les documents mis à jour en fonction d'une fenêtre de date et d'heure en mouvement. Je ne dis pas qu'il y aurait beaucoup de dérive temporelle, mais l'approche d'Aheckmann contre pre('update') contiendrait probablement plus de dérive au moment où la sauvegarde se produira.

J'aimerais voir une option middleware ici.

Alors, quelle est la solution de contournement ? Je m'attendais à ce que pre('save') attrape les mises à jour, qui me semblent sémantiquement comme des sauvegardes. Étant donné que les mises à jour sont si courantes, cela rend le crochet de sauvegarde beaucoup moins précieux.

Je ne sais pas si quelqu'un regarde toujours cela ou non, mais je regarde les documentations de Mongoose -
Mangouste
sous _Notes sur la section findAndUpdate()_ fait référence à issues/964 qui explique pourquoi cela ne fonctionne pas. J'espère que cela pourra aider! :)

C'est de la merde. nous ne pouvons rien faire d'asynchrone dans les setters. idiots.

c'est un très vieux fil mais ok. Il y a des prés qui perturbent réellement ceci ou cela a été découvert depuis la publication.

Tout va bien, je suis allé de l'avant et j'ai réorganisé mon code pour créer un findById, puis une sauvegarde ultérieure, de sorte que le crochet de pré-sauvegarde pour saler un mot de passe fonctionne toujours. Je suppose que c'est ce que c'est, même s'il serait bien d'avoir également un crochet de pré-mise à jour, il faudra encore deux requêtes pour entretenir l'opération car vous devez lire les données et vérifier si elles ont changé de quelque façon que ce soit avec isModifed

Marquage #964 et cognement pour l'intérêt.

Cette page vous a été utile?
0 / 5 - 0 notes