Mongoose: schema.pre('save') wird nicht von MyModel.update() ausgelöst

Erstellt am 16. Juli 2011  ·  11Kommentare  ·  Quelle: Automattic/mongoose

beispiel.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)
  })  
})

Ausgabe:

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

Das Pre wird durch das anfängliche Speichern ausgelöst, aber nicht durch das Update.

Hilfreichster Kommentar

Dies ist kein Fehler. pre save ist ein Hook, der auf Instanzen ausgelöst wird, wenn ihre Methode save aufgerufen wird, nicht auf dem Modell, wenn update aufgerufen wird.

Mit Model.update können Sie atomare $set-Operationen direkt an mongodb senden.

Alle 11 Kommentare

Dies ist kein Fehler. pre save ist ein Hook, der auf Instanzen ausgelöst wird, wenn ihre Methode save aufgerufen wird, nicht auf dem Modell, wenn update aufgerufen wird.

Mit Model.update können Sie atomare $set-Operationen direkt an mongodb senden.

Dies ist eine Funktion, die ich gerne hätte; besonders hilfreich beim Upserting von spärlichen Daten.

@aheckman ich mit @martindale zustimmen, ich glaube , dass in UI wo wir $.ajax Form so aktualisiert , wie durch eine vorübergehenden req.body._id zu einem Post Route, irgendeine Art von Pre - Methode praktisch wäre. Ein Beispiel für einen Anwendungsfall ist, wenn Sie zwei Zahlen übermitteln und das Modell ein pre('save') für die Berechnung der Summe haben soll.

vielleicht pre('update') ofc

Ich habe dies auch bemerkt, daher gehe ich davon aus, dass dies keine Verbesserung ist, die es wert ist, hinzugefügt zu werden.

Ich habe mich für den Ansatz von Aheckmann entschieden, bei dem ich das Datumsfeld updatedOn meines Objekts aktualisieren muss. Wenn Auditing jedoch etwas ist, das ich auf Middleware-Ebene verwenden möchte, riecht dieser Ansatz.

Das Festlegen eines Datums ist in meinem Fall sehr sensibel für den Moment, in dem das Speichern an mongodb übergeben wird, da ich einen Hintergrundprozess habe, der aktualisierte Dokumente basierend auf einem sich bewegenden Datums- und Zeitfenster lädt. Ich sage nicht, dass es viel Zeitdrift geben würde, aber Aheckmanns Ansatz vs. pre('update') würde wahrscheinlich mehr Drift enthalten, wenn die Speicherung stattfindet.

Ich würde hier gerne eine Middleware-Option sehen.

Was ist also die Problemumgehung? Ich hatte erwartet, dass pre('save') Updates abgefangen hätte, die mir semantisch wie Saves erscheinen. Da Updates so häufig sind, wird der Save-Hook viel weniger wertvoll.

Ich bin mir nicht sicher, ob sich das noch jemand ansieht oder nicht, aber schaue in die Mongoose-Dokumentationen -
Mungo
unter _Hinweise zu findAndUpdate()_ wird auf Issues/964 verwiesen, was erklärt, warum dies nicht funktioniert. Ich hoffe, das hilft! :)

Das ist verdammter Quatsch. Wir können in Settern nichts asynchrones tun. Idioten.

das ist ein wirklich alter Thread, aber ok. Es gibt Pres, die dies tatsächlich aufdecken oder seit dem Post herausgefunden wurden.

Es ist alles gut Trent, ich habe meinen Code reorganisiert, um eine findById und dann eine anschließende Speicherung zu erstellen, damit der Pre-Save-Hook zum Salten eines Passworts immer noch funktioniert. Ich denke, es ist, was es ist, obwohl es auch schön wäre, einen Pre-Update-Hook zu haben, es dauert immer noch zwei Abfragen, um die Operation zu bedienen, da Sie Daten lesen und überprüfen müssen, ob sie sich mit isModifed geändert haben

Tagging #964 und Anstoßen nach Interesse.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen