2012-03-11 27 views
5

Estoy tratando de encontrar la mejor manera de rastrear los cambios a los campos cuando se usa mongoose.js. Por ejemplo, cada vez que se establece el campo name en un objeto, deseo agregar una nueva entrada al historial de ese objeto (como un documento incrustado) que se parece al { field: 'name', previous: 'foo', current: 'bar', date: '3/06/2012 9:06 am' }.Seguimiento de cambios en los campos usando mongoose.js

Comencé tratando de usar un complemento que engancha .pre('save') pero no puedo determinar qué campos se han modificado sin tomar el valor anterior de la base de datos y compararlos yo mismo. Entonces pensé que podría usar arreglos personalizados, pero me encontré con el mismo problema: no sé qué campo se modificó. Actualmente me queda hacer algo como esto lo que impide la modificación de nombre de campo en la incubadora:

var comment = new Schema({ 
    name : { type: String, set: trackName }, 
    history : [Change] 
}); 

var trackName = function(val) { 
    var change = new Change; 
    change.field = 'name'; 
    change.previous = this.name; 
    change.current = val; 
    change.date = Date.now(); 
    this.history.push(change); 
    return val; 
} 

Pero esto significa que necesito un regulador de la medida para cada nombre de campo que quiero seguir. Supongo que debe haber una mejor manera de lograr esto.

Respuesta

4

Parece que he perdido 'Document.modifiedPaths'. Esto hace exactamente lo que necesito para determinar qué campos se han modificado.

+3

¿cómo obtuviste los valores anteriores simplemente usando modifiedPaths? –

+1

@ Totty.js Para cualquiera que tropiece con esta pregunta, mongoose actualmente no rastrea los valores antiguos automáticamente, pero aquí hay una solución: https://pste.me/#/FU1Kg – helion3

+0

@ helion3 parece que ese enlace está desactualizado –

Cuestiones relacionadas