在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代码! 因此不能解决我们面临的实际问题。 但它可以与任何遇到此特定问题的人员提供的示例一起使用