6

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 はプレミドルウェアでは定義されていません。

これを行う方法はありますか?ありがとう

4

2 に答える 2

1

配列操作で機能するソリューションをまだ探している場合は、新しいバージョンの mongoose (少なくとも4.0.7+)のように見えますthis._updateが、プレミドルウェアで定義されています。

于 2015-08-23T19:10:41.160 に答える
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 および $unset に対して validate:[...] を実行します。

ただし、何らかの理由で $push や $addToSet などの配列操作では機能しません。したがって、配列を更新すると、検証コードはまったく実行されません! したがって、私が直面している実際の問題は解決しません。しかし、この特定の問題に遭遇した人のために提供された例で動作します

于 2015-05-24T13:46:12.947 に答える