Mongoose中基于两个场的第三场计算

dfddblmv  于 2022-11-13  发布在  Go
关注(0)|答案(3)|浏览(122)

我在Mongoose模型上有2个字段:totalAttempts和totalRight。我计划根据它们来计算准确性。

totalAttempts: {
    type: Number,
    default: 1
},
totalRight: { 
    type: Number,
    default: 1
}

这就是我所做的[它不起作用]

accuracy:{
     type:Number,
     required:function() {return (this.totalRight/this.totalAttempts*100).toFixed(2)}
}

此外,如果我没有将默认值设置为Accuracy,则会出现错误:

ERROR; While creating new question ..ValidationError: Path `accuracy` is require                      d.

events.js:163

什么是正确的方法来完成这一点?我已经有一个工作的解决方案,以获得totalAttempts和totalRight每次用户请求该模型。但我想保存该计算和存储信息在我的数据库。

hivapdat

hivapdat1#

预保存是正确的方法。将其添加到您的模式中。

ModelSchema
.pre('save', function(next){
  this.accuracy = this.totalRight/this.totalAttempts*100).toFixed(2)
  next();   
});

accuracy定义更改为:

accuracy: {
     type: Number
}
jvlzgdj9

jvlzgdj92#

在保存文档之前不需要进行计算,只需要添加一个虚拟字段,在需要时获取精度值

yourSchema.virtual("accuracy").get(function () {
    return this.totalRight/this.totalAttempts*100).toFixed(2)
});

现在,当您查询此文档时,您将获得准确性,但不要忘记在文档查询中使用.toJSON({ virtuals: true })
有关mongoose中的虚拟化的更多信息,请查看mongoose virtuals。当使用lean时,请使用此插件mongoose-lean-virtuals

flseospp

flseospp3#

请尝试以下操作:

accuracy:{
     type: Number,
     required:true,
     default: function() {
     return (this.totalRight/this.totalAttempts*100).toFixed(2)
}}

相关问题