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

时间:2017-05-13 17:25:38

标签: node.js mongodb mongoose mongoose-schema

我在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

实现这一目标的正确方法是什么?每次用户请求Model时,我都有一个工作解决方案来获取totalAttempts和totalRight。但我想在我的数据库中保存该计算和存储信息。

2 个答案:

答案 0 :(得分:4)

预先保存是正确的方法。将其添加到您的架构中。

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

accuracy定义更改为:

accuracy: {
     type: Number
}

答案 1 :(得分:1)

在保存文档之前,您不需要计算它。 您只需要添加一个虚拟字段,即可在需要时获取准确性的值

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

现在,当您查询该文档时,您将获得准确性,但不要忘记在文档查询中使用.toJSON({ virtuals: true })


有关猫鼬虚拟物品的更多信息,请检查mongoose virtuals。 使用精益时,请使用此插件mongoose-lean-virtuals