2013-08-12 15 views
8

voglio sapere qual è il valore di 'pulito' di un puntello sporco è in un salvataggio pre-gancio mangusta come questo:mangusta valore get db in pre-save agganciare

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() 
} 

E 'possibile guardare in alto il vecchio valore senza cercarlo nel db?

risposta

5

Quindi, in un gancio di pre-salvataggio, da quello che posso dire leggendo this section of the source code, non penso che il valore precedente sia memorizzato da nessuna parte. Quindi dovrai caricare il documento da mongodb per ottenerlo.

Tuttavia, è possibile utilizzare il meccanismo virtuals anziché un gancio di pre-salvataggio per memorizzare il vecchio valore prima di cambiarlo con il nuovo valore.

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

Sperimentare qualcosa seguendo queste linee e vedere se è possibile far funzionare qualcosa in modo adeguato.

+0

perché suggerisco di usare un 'virtual' vs' path'? – mkoryak

+0

Poiché 'percorso' definisce solo il nome e il tipo di una proprietà dati, mentre' virtuale' consente di definire una proprietà a cui si accede tramite metodi get/set in cui è possibile inserire il codice. –

+0

@PeterLyons Ci scusiamo per resuscitare il thread precedente, ma penso che questo approccio non funzionerà se ci sono più server di nodo distribuiti dietro il bilanciamento del carico, giusto? – Saurabh

19

Per impostazione predefinita, i valori precedenti non vengono memorizzati. Dovresti fare è tracciare i vecchi dati con un hook post init (una funzione di mangusta).

Quello che facciamo è allegare copia del documento originale a tutti gli oggetti estratti da MongoDB. Abbiamo questo codice per ogni schema abbiamo bisogno di ottenere i dati pre-sporco per il confronto:

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

NodeJS è abbastanza efficiente, e non copia su scrittura quando possibile, in modo che non si vede il doppio del consumo di memoria a meno che non modificare l'intero documento. Solo allora _original effettivamente consuma il doppio della memoria.