假设有表有以下三个字段,均是number类型
num1,num2,num3
我想通过update语句计算,伪代码如下:
selet table set num3=num1+num2
在实际项目运用场景,考试系统,每道题有答对次数和答错次数,我需要进行正确率统计。
即 num3=num1/(num1+num2)。
网上搜索大量代码,都无法实现,如以下代码
Model.updateMany({ accuracy: { '$add': ['$right','$wrong']}})
因为add函数只能使用在,aggregate聚合中。也就是说我可以通过聚合查询,然后计算出正确率统计,也就是说数据库并不存在此字段,仅仅是通过查询结果后再生成,经过我再三考虑。因为我还需要对正确率进行后续操作,如排序、图表生成等,如果每次都要计算生成,那么开销太大了,所以还是要设置一个字段,每次更新答对次数和答错次数时,进行更新正确率。
那么目前看来只能用到mongodb的foreach函数了,代码如下。
async incRight(IDs: string[]) {
return (await Model.find({ _id: { $in: IDs } })).forEach(async (item) => {
await Model.updateOne({ _id: item._id }, { '$inc': { 'right': 1 }, accuracy: ((item.right! + 1) / (item.wrong! + item.right! + 1)).toFixed(4) })
})
}
这样做的话,当find中的数据比较大的话,性能可能会产生问题,所以请大家自行斟酌。