【问题标题】:Mongoose pre save hook is triggering while updating via Model.save()通过 Model.save() 更新时触发 Mongoose 预保存挂钩
【发布时间】:2020-05-13 18:50:37
【问题描述】:

我正在通过 pre hook 为 mongodb 文档保存一个较小的唯一 ID。

schema.pre('save', function(next) {
    this.refId = uid();
    next();
});

据我了解,save 挂钩仅在创建文档时运行。

但是当我通过查询获取文档并尝试通过添加一些新数据来保存它时,唯一 id (refId) 字段也会更新。

const foo = Foo.findOne({refId: 'fwe23fw23'});

Foo.field = 'new value';
Foo.save(); // runs pre hook again;

这让我相信 save 钩子在每个 save() 查询上运行,无论它是否是 createupdate 方法。

如何确保refId 只创建一次,并且在任何更新操作中都不会更改?

注意:我知道我可以在模型本身上使用updateOne() 来更新文档。但我想了解为什么保存文档本身不起作用。

【问题讨论】:

    标签: mongodb mongoose mongoose-schema


    【解决方案1】:

    document.save()Model.create 都会触发预保存挂钩。

    您可以使用isNew 属性来检查文档是否已创建。

    schema.pre("save", function(next) {
      if (this.isNew) {
        this.refId = uid();
      }
    
      next();
    });
    

    现在 refId 只会在创建文档时创建一次,使用保存时它的值不会改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-14
      • 2019-11-13
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 2020-12-30
      相关资源
      最近更新 更多