scheme部分结构如下:
torf:{ // 判断题数量和得分,必须有count和score两个属性
type:{count:Number,score:Number,_id: false },
required:true
},
single:{ // 单选题数量
type:{count:Number,score:Number,_id: false },
required:true
},
multiple:{ // 多选题数量
type:{count:Number,score:Number,_id: false },
required:true
}
这三个属性都是对象,我需要统计某一个对象中,count属性最高的数字也就是max值。
这里就要到聚合函数了,个人感觉mongodb的聚合函数,跟sql比起来复杂多了,看了多少遍文档还是没有完全能理解,只能不断尝试语句,才能最终得到需要的数据。
话不多说,代码如下:
/**
* 获得指定分类下,指定题型数量的最大值
*/
getMaxByCatalog(catalog: string, type: TQABankType) {
return Model.aggregate<{ _id: TQABankType, max: number }>().match({ catalog })
.group({ _id: type, max: { $max: `$${type}.count` } })
}
由于是ts写的,参数定义了类型,aggretate里传了一个泛型,js的话直接忽略。
简单说一下,match是匹配数据,只有满足的条件才会进入下一步。
至于group之后的_id,我个人也不是很明白,必须得写,不写报错,而且还必须是"_id",之后的$max对象,就是你需要查询的属性,如果是对象,也可以传入子属性。
我这里用了一个字符串拼接,实际就是查找{$max:'$torf.count'}。
最终得到的结果就是这样,是一个数组。
[ { _id: 'single', max: 5 } ]
好了,至此就能在mongoose中,实现最大值的查找了,最小值也一样max换成min即可。