更新时如何执行PRE保存挂钩功能

发布于 2025-01-20 20:54:24 字数 542 浏览 1 评论 0原文

在我的文档中,我有一些名为身高、体重、BMI的属性。我使用预保存挂钩来计算和存储文档创建或保存时的BMI。但我想在身高或体重更新时更新 BMI。

//这是我使用的预保存钩子

studentSchema.pre('save', function (next) {
  this.bmi = calcBMI(this.height, this.weight);
  next();
});

//BMI计算函数

exports.calcBMI = (height, weight) => {
  const heightInMeters = height / 100;
  const bmi = (weight / heightInMeters ** 2).toFixed(2);
  return bmi;
};

这个函数在我创建新学生时效果很好。

In my document I have some properties called height, weight, BMI. I used the pre save hook to calculate and store the BMI on document create or save. But I want to Update the BMI whenever the height or weight is updated.

//this is the pre save hook that I used

studentSchema.pre('save', function (next) {
  this.bmi = calcBMI(this.height, this.weight);
  next();
});

//BMI Calculating Function

exports.calcBMI = (height, weight) => {
  const heightInMeters = height / 100;
  const bmi = (weight / heightInMeters ** 2).toFixed(2);
  return bmi;
};

This function works well when I create a new student.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

仲春光 2025-01-27 20:54:24

您必须在架构中使用Mongoose Setters,例如:

const studentSchema = new Schema({
  weight: {
    type: Number,
    set: () => this.bmi = calcBMI(this.height, this.weight);
  },
...same with height
});

官方Mongoose页面: >

you have to use mongoose setters in schema like:

const studentSchema = new Schema({
  weight: {
    type: Number,
    set: () => this.bmi = calcBMI(this.height, this.weight);
  },
...same with height
});

official mongoose page: mongoose setters page

感受沵的脚步 2025-01-27 20:54:24

您可以在文档属性上使用 isModified() 辅助函数并检查它是否发生更改

studentSchema.pre('save', function (next) {
  const std = this;
  if(std.isModified("height") || std.isModified("weight")){
   this.bmi = calcBMI(this.height, this.weight)
}
  next();
});

You can use isModified() helper function on a document property and check if it's change or not

studentSchema.pre('save', function (next) {
  const std = this;
  if(std.isModified("height") || std.isModified("weight")){
   this.bmi = calcBMI(this.height, this.weight)
}
  next();
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文