提问者:小点点

Mongoose pre save钩子在通过model.save()更新时触发


我正在通过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()查询上运行,无论它是create还是update方法。

如何确保refid只创建了一次,并且从不在任何更新操作中更改?

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


共1个答案

匿名用户

document.save()model.create都触发预保存钩子。

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

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

  next();
});

现在refId将只在创建文档时创建一次,并且在使用save时它的值不会改变。