2015-05-23 41 views
5

我正在尝试使用mongoose> 4.0.0的新不稳定版本来验证更新查询。在猫鼬pre中间件中,我如何访问更新查询?

说,我想用下面的查询

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

我如何得到{集的更新查询更新模式: {a:'blah'}}在执行更新之前我可以做一些检查吗?

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

schema.post('update',function(){ 
var findQuery=this._conditions; // gives {_id:'blah'} 

var updateQuery=this._update; //gives {$set:{a:'blah'}} 

next(); 
}); 

但那为时已晚,我需要这在预中间件实际更新数据库之前检查。

我试图查看pre中间件的'this'对象,但无法找到任何地方的updateQuery对象,并且this._update在pre中间件中未定义。

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

回答

1

如果您仍然在寻找可用于阵列操作的解决方案,它看起来像新版本的猫鼬(至少4.0.7+),在前置中间件中定义了this._update

0

我发现了一个解决这个特定的例子,但它并没有很好地解决我的实际问题。你可以在mongoose version〜4.0.0中做什么,是让pre中间件指定在更新时通过模型验证。

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

基本上,您可以指定模式

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

您可以选择跳过正常的验证通过使用内部验证功能this.isNew检查保存操作中的验证。

此代码将在您的更新查询中的任意$ set和$ unset上运行验证:[...]。

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