9

次のような保存前のマングースフックで、ダーティプロップの「クリーン」値が何であるかを知りたいです。

UserSchema.pre('save', function(next) {
    var user = this;

    if (user.isModified('password')){
       //i want to know what the value of user.password was before it was changed
    }
    next()
}

データベースで検索せずに古い値を検索することは可能ですか?

4

2 に答える 2

24

デフォルトでは、古い値は保存されません。post init フック (mongoose 機能) を使用して古いデータを追跡する必要があります。

MongoDB から取得したすべてのアイテムに元のドキュメントのコピーを添付します。比較のためにダーティ前のデータを取得する必要があるスキーマごとに、次のコードがあります。

schema.post( 'init', function() {
    this._original = this.toObject();
} );

NodeJS は非常に効率的で、可能な場合はコピー オン ライトを実行するため、ドキュメント全体を変更しない限り、メモリ消費量が 2 倍になることはありません。そうして初めて、_original は実際に 2 倍のメモリを消費します。

于 2013-08-12T20:11:59.560 に答える
5

したがって、事前保存フックでは、ソースコードのこのセクションを読んでわかることから、以前の値がどこにも保存されていないと思います。そのため、mongodb からドキュメントを読み込んで取得する必要があります。

ただし、virtuals事前保存フックの代わりにこのメカニズムを使用して、古い値を新しい値に変更する前に保存したい場合があります。

var virtual = schema.virtual('password');
virtual.set(function (v) {
  var this._oldPassword = this.password;
  return v;
});

それらの線に沿って何かを試して、何かが適切に機能するかどうかを確認してください.

于 2013-08-12T18:36:27.447 に答える