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

新手上路,请多包涵

我需要知道修改过的字段,或者特定字段是否在 Mongoose 模式的更新 更新 钩子中被修改。我尝试了以下方法,但仍然无法弄清楚:

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

我知道也许有一个方法 isModified 就像在 保存 中一样,但我不知道如何用 更新 挂钩做同样的事情。任何建议将不胜感激。

原文由 jemlifathi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 444
1 个回答

如果您想知道正在修改哪些字段,则需要通过调用 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()

因为 this预保存 挂钩中引用了文档:

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

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

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

因为在调用 update 时, _文档挂钩_(例如 pre-savepost-save )根本没有被执行。相反,在这种情况下会执行 _查询挂钩_(例如 pre-updatepost-update )。 查询挂钩 的问题是 this 它们内部没有引用文档,所以 this.modifiedPaths === undefined

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

原文由 Piotr Kowalski 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题