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 挂钩(猫鼬功能)跟踪旧数据。

我们所做的是将原始文档的副本附加到从 MongoDB 中提取的所有项目中。我们为每个模式都有这个代码,我们需要获取预脏数据以进行比较:

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

NodeJS 非常高效,并且在可能的情况下会在写入时进行复制,因此除非您修改整个文档,否则您不会看到双倍的内存消耗。只有这样 _original 才会真正消耗双倍的内存。

于 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 回答