mongodb - update - ¿Mongoose proporciona acceso al valor anterior de la propiedad en pre(''guardar'')?
mongoose update (3)
Me gustaría comparar el valor nuevo / entrante de una propiedad con el valor anterior de esa propiedad (lo que actualmente se guarda en la base de datos) dentro de un middleware pre(''save'')
.
¿Mongoose proporciona una facilidad para hacer esto?
Honestamente, probé las soluciones publicadas aquí, pero tuve que crear una función que almacenara los valores antiguos en una matriz, guardara los valores y luego viera la diferencia.
// Stores all of the old values of the instance into oldValues
const oldValues = {};
for (let key of Object.keys(input)) {
if (self[key] != undefined) {
oldValues[key] = self[key].toString();
}
// Saves the input values to the instance
self[key] = input[key];
}
yield self.save();
for (let key of Object.keys(newValues)) {
if (oldValues[key] != newValues[key]) {
// Do what you need to do
}
}
La respuesta aceptada funciona muy bien. También se puede utilizar una sintaxis alternativa, con el definidor en línea con la definición de esquema:
var Person = new mongoose.Schema({
name: {
type: String,
set: function(name) {
this._previousName = this.name;
return name;
}
});
Person.pre(''save'', function (next) {
var previousName = this._previousName;
if(someCondition) {
...
}
next();
});
Mongoose le permite configurar configuradores personalizados en los que hace la comparación. pre (''guardar'') por sí solo no le dará lo que necesita, pero juntos:
schema.path(''name'').set(function (newVal) {
var originalVal = this.name;
if (someThing) {
this._customState = true;
}
});
schema.pre(''save'', function (next) {
if (this._customState) {
...
}
next();
})