在mongoose预中间件中,如何访问更新查询?

时间:2015-05-23 05:37:51

标签: node.js mongodb express mongoose mongoose-plugins

我正在尝试使用新的不稳定版本的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'}}的更新查询,以便在执行更新之前进行一些检查?

或者我知道可以在后中间件

中访问更新查询
schema.post('update',function(){
var findQuery=this._conditions;  // gives {_id:'blah'}

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

next();
});

但是为时已晚,我需要在预备中间件中进行检查,然后再实际更新数据库。

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

有办法做到这一点吗? 感谢

2 个答案:

答案 0 :(得分:1)

我通过这个特定的例子找到了一个解决方案,但它并没有完全解决我的实际问题。你可以在mongoose版本~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上运行validate:[...]并在更新查询中为$ unset设置。

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

答案 1 :(得分:1)

如果您仍在寻找适用于阵列操作的解决方案,则看起来在较新版本的mongoose(至少4.0.7+)中,this._update在前面定义中间件。