node.js mongodb express mongoose mongoose-plugins

node.js - En mongoose pre middleware, ¿cómo accedo a la consulta de actualización?



mongoose mongodb (2)

Estoy intentando usar la nueva versión inestable de mangosta> 4.0.0 para validar las consultas de actualización.

decir que quiero actualizar un esquema usando la siguiente consulta

schema.update({_id:''blah''},{a:''blah''},function(err){ //do your thing })

así que digamos que tengo el siguiente esquema,

var schema = new Schema({ a:{type:String} }); schema.pre(''update'',function(next){ var findQuery=this._conditions; // gives {_id:''blah''} // how do i get {a:''blah''}???? next(); });

¿Cómo obtengo la consulta de actualización de {set: {a: ''blah''}} en el middleware previo para poder hacer algunas comprobaciones antes de ejecutar la actualización?

alternativamente, sé que se puede acceder a la consulta de actualización en el middleware posterior, en

schema.post(''update'',function(){ var findQuery=this._conditions; // gives {_id:''blah''} var updateQuery=this._update; //gives {$set:{a:''blah''}} next(); });

pero eso es demasiado tarde, necesito esto en el middleware previo para verificar antes de actualizar realmente el db.

intenté buscar en el objeto ''this'' del middleware previo, pero no puedo encontrar el objeto updateQuery en ninguna parte y this._update no está definido en el middleware previo.

¿Hay alguna forma de hacer esto? Gracias


Encontré un trabajo alrededor de este ejemplo en particular, sin embargo, no soluciona completamente mi problema real. Lo que puede hacer en la versión de mangosta ~ 4.0.0 es dejar que el middleware previo especifique pasar por la validación del modelo en la actualización.

schema.pre(''update'',function(next){ this.options.runValidators = true; // make sure any changes adhere to schema })

básicamente, puede especificar los validadores dentro del esquema

var schema = new Schema({ a:{ type:String, validate:[...] //the validation you want to run } });

puede optar por omitir la validación en una operación de guardado normal utilizando el control this.isNew dentro de las funciones de validación.

Este código se ejecutará validar: [...] en cualquier $ set y $ unset a a en su consulta de actualización.

sin embargo, no funciona en operaciones de matriz como $ push o $ addToSet por algún motivo. así que si actualizas una matriz, ¡no ejecutará el código de validación en absoluto! por lo tanto, no resuelve el problema real al que me enfrento. pero puede funcionar con el ejemplo proporcionado para cualquier persona que se encuentre con este problema en particular


En caso de que aún esté buscando una solución que funcione en operaciones de matriz, parece que en las versiones más nuevas de mongoose (al menos 4.0.7+ ), this._update se define en el pre-middleware.