Mon goose ловушка предварительного сохранения срабатывает при обновлении через Model.save () - PullRequest
1 голос
/ 28 января 2020

Я сохраняю меньший уникальный идентификатор для документов mongodb через предварительный хук.

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

Насколько я понимаю, save хук запускается только при создании документа.

Но когда я получаю документ с помощью запроса и пытаюсь сохранить его, добавив новые данные, обновляется также поле уникального идентификатора (refId).

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

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

Это заставляет меня поверить, что save ловушка запускается при каждом запросе save(), независимо от того, есть ли у него метод create или update.

Как сделать так, чтобы refId создавался только один раз и никогда не менялся ни при какой операции обновления?

ПРИМЕЧАНИЕ: я понимаю, что могу использовать updateOne() на самой модели для обновления документа. Но я хочу понять, почему сохранение самого документа не работает.

1 Ответ

1 голос
/ 28 января 2020

И document.save(), и Model.create запускают ловушку предварительного сохранения.

Вы можете использовать свойство isNew , чтобы проверить, создан ли документ.

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

  next();
});

Теперь refId будет создаваться только один раз при создании документа, и его значение не изменится при сохранении.

...