在mongoosepre中间件,我如何访问更新查询?

我正在尝试使用mongoose> 4.0.0的新不稳定版本来validation更新查询。

说我想要使用以下查询更新架构

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

所以可以说我有以下模式,

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

我如何得到{pre:中间件中的{set:{a:'blah'}}的更新查询,以便在执行更新之前执行一些检查?

或者我知道更新查询可以在post中间件中访问,

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

但是这太晚了,我需要在pre中间件中检查实际更新数据库之前。

我试图通过前中间件的这个“对象”,但无法find任何地方的updateQuery对象,而这个._update在前置中间件中是未定义的。

有没有办法做到这一点? 谢谢

如果你仍然在寻找一个适用于数组操作的解决scheme,它看起来像新版本的mongoose(至less4.0.7+ ), this._update是在前置中间件中定义的。

我通过这个特定的例子find了一个工作,但是它并不能很好地解决我的实际问题。 在mongoose版本〜4.0.0中你可以做的是让前置中间件指定在更新时通过模型validation。

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

基本上,你可以在模式中指定validation器

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

您可以select跳过正常保存操作的validation,方法是在validation函数中使用this.isNew检查。

此代码将在您的更新查询中运行validation:[…]任何$ set和$ unset。

然而,由于某些原因,它不能用于像$ push或$ addToSet这样的数组操作。 所以如果你更新一个数组,它将不会运行validation代码! 因此不能解决我们面临的实际问题。 但它可以与任何遇到此特定问题的人员提供的示例一起使用