2013-08-12 8 views
8

Ich möchte wissen, was die ‚saubere‘ Wert eines schmutzigen Stütze ist in einem vorge speichern Mungo Haken wie folgt aus:Mungo get db Wert in vorge speichern Haken

UserSchema.pre('save', function(next) { 
    var user = this; 

    if (user.isModified('password')){ 
     //i want to know what the value of user.password was before it was changed 
    } 
    next() 
} 

Ist es möglich, bis zu schauen der alte wert ohne in der db nachzuschlagen?

Antwort

5

Also in einem Pre-Speichern Haken, von dem, was ich durch Lesen this section of the source code sagen kann, glaube ich nicht, dass der vorherige Wert irgendwo gespeichert ist. Also musst du das Dokument von mongodb laden, um es zu bekommen.

Sie könnten jedoch auch die virtuals Mechanismus anstelle eines vorge speichern Haken verwenden möchten den alten Wert zu speichern, bevor es auf den neuen Wert zu ändern.

var virtual = schema.virtual('password'); 
virtual.set(function (v) { 
    var this._oldPassword = this.password; 
    return v; 
}); 

Experimentieren Sie mit etwas in dieser Richtung und sehen Sie, ob Sie etwas angemessen arbeiten können.

+0

Warum schlagen Sie vor, dass ich einen 'virtuellen' vs' Pfad' verwende? – mkoryak

+0

Weil 'path' nur den Namen und den Typ einer Dateneigenschaft definiert, während' virtual' es erlaubt, eine Eigenschaft zu definieren, auf die über get/set-Methoden zugegriffen wird, wo Sie Code einfügen können. –

+0

@PeterLyons Entschuldigung für das Zurücksetzen des alten Threads, aber ich denke, dieser Ansatz funktioniert nicht, wenn hinter dem Load Balancer mehrere Knotenserver installiert sind, oder? – Saurabh

19

Standardmäßig werden die alten Werte nicht gespeichert. Sie müssen die alten Daten mit einem Post-Init-Hook (einer Mungo-Funktion) verfolgen.

Was wir tun, ist eine Kopie des Originaldokuments an alle aus MongoDB gezogenen Objekte anzuhängen. Wir haben diesen Code für jedes Schema benötigen wir vorab Dirty-Daten für einen Vergleich zu bekommen:

schema.post('init', function() { 
    this._original = this.toObject(); 
}); 

NodeJS ist ziemlich effizient und auf Schreib kopiert, wenn möglich, so dass Sie nicht den doppelten Speicherverbrauch, wenn Sie sehen Ändern Sie das gesamte Dokument. Nur dann verbraucht _original tatsächlich den doppelten Speicher.