如何检查Mongoose.js中更新前/后挂钩中的修改字段

时间:2017-10-05 15:41:03

标签: javascript node.js mongodb mongoose mongoose-schema

我需要知道已修改的字段,或者是否在Mongoose架构中的发布 更新挂钩中修改了特定字段。 我尝试了以下内容,但仍无法弄明白:

schema.post('update', function (doc) {
    //check modified fields or if the name field was modified and then update doc
});

我知道也许有一种方法 isModified ,如 保存,但我不知道如何使用更新挂钩。 任何建议将不胜感激。

4 个答案:

答案 0 :(得分:2)

如果您想知道要修改的字段,则需要通过调用save发出更新命令:

Tank.findById(id, function (err, tank) {
  if (err) return handleError(err);

  tank.set({ size: 'large' });
  tank.save(function (err, updatedTank) {
    if (err) return handleError(err);
    res.send(updatedTank);
  });
});

这样就可以调用预保存挂钩,您将可以访问:

Document.prototype.modifiedPaths()

因为 pre-save 挂钩中的this引用了该文档:

TankSchema.pre('save', function (next) {
  // ...
  this.modifiedPaths();
  // ...
});

另一方面,通过调用update发出 update 命令时,您将无法获得相同的结果:

Tank.update({ _id: id }, { $set: { size: 'large' }}, callback);

因为在调用update时,文档挂钩(例如预存保存后)未执行所有。相反,在这种情况下,正在执行查询挂钩(例如,更新前更新后)。而查询挂钩的问题是它们内部的this没有引用该文档,因此this.modifiedPaths === undefined

schema.post('update', function (doc) {
  // `this` refers to model.Query
  // `doc` refers to CommandResult 
});

答案 1 :(得分:1)

试一试:

 schema.post('update', function () {
     const modifiedFields = this.getUpdate().$set;
     // ...
 });

答案 2 :(得分:0)

没有直接的方法可以做到。猫鼬正在跟踪一个名为isNew的变量,以检查是否创建了新文档。

有关文档#isNew的信息,请参见Document#isNew

但是,您可以创建自己的跟踪器来检入后期保存挂钩,以识别文档是否已更新。

schema.pre('save', function (doc) {
    this.isDocUpdated = false;
    if (this.isModified()) {
        this.isDocUpdated = true;
    }
});

schema.pre('save', function (doc) {
    if (this.isDocUpdated) {
        console.log('post save hook');
    }
});

答案 3 :(得分:-1)

看看:

http://mongoosejs.com/docs/api.html#document_Document-modifiedPaths

返回修改后的路径数组。

  schema.pre('save', function (next) {
    //check modified fields or if the name field was modified and then update doc
    var modified_paths = this.modifiedPaths();
    next();
  })