在猫鼬预中间件中,我如何访问更新查询?
In mongoose pre middleware, how do i access the update query?
我正在尝试使用 mongoose >4.0.0 的新不稳定版本来验证更新查询。
假设我想使用以下查询更新架构
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();
});
如何在预中间件中获取 {set:{a:'blah'}} 的更新查询,以便在执行更新之前进行一些检查?
或者我知道可以在 post 中间件中访问更新查询,在
schema.post('update',function(){
var findQuery=this._conditions; // gives {_id:'blah'}
var updateQuery=this._update; //gives {$set:{a:'blah'}}
next();
});
但为时已晚,我需要在预中间件中进行此检查,然后再实际更新数据库。
我尝试查看前置中间件的 'this' 对象,但无法在任何地方找到 updateQuery 对象,并且 this._update 在前置中间件中未定义。
有办法吗?
谢谢
我通过这个特定示例找到了解决方法,但它并没有完全解决我的实际问题。在猫鼬版本 ~4.0.0 中你可以做的是让预中间件指定在更新时通过模型验证。
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 到更新查询中的 a。
但是,由于某些原因,它不适用于 $push 或 $addToSet 等数组操作。所以如果你更新一个数组,它根本不会 运行 验证码!因此它不能解决我面临的实际问题。但它可以与为遇到此特定问题的任何人提供的示例一起使用
如果您仍在寻找适用于数组操作的解决方案,它看起来像在较新版本的 mongoose 中(至少 4.0.7+
),this._update
是在预定义的中间件。
我正在尝试使用 mongoose >4.0.0 的新不稳定版本来验证更新查询。
假设我想使用以下查询更新架构
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();
});
如何在预中间件中获取 {set:{a:'blah'}} 的更新查询,以便在执行更新之前进行一些检查?
或者我知道可以在 post 中间件中访问更新查询,在
schema.post('update',function(){
var findQuery=this._conditions; // gives {_id:'blah'}
var updateQuery=this._update; //gives {$set:{a:'blah'}}
next();
});
但为时已晚,我需要在预中间件中进行此检查,然后再实际更新数据库。
我尝试查看前置中间件的 'this' 对象,但无法在任何地方找到 updateQuery 对象,并且 this._update 在前置中间件中未定义。
有办法吗? 谢谢
我通过这个特定示例找到了解决方法,但它并没有完全解决我的实际问题。在猫鼬版本 ~4.0.0 中你可以做的是让预中间件指定在更新时通过模型验证。
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 到更新查询中的 a。
但是,由于某些原因,它不适用于 $push 或 $addToSet 等数组操作。所以如果你更新一个数组,它根本不会 运行 验证码!因此它不能解决我面临的实际问题。但它可以与为遇到此特定问题的任何人提供的示例一起使用
如果您仍在寻找适用于数组操作的解决方案,它看起来像在较新版本的 mongoose 中(至少 4.0.7+
),this._update
是在预定义的中间件。