mongoose中,使用聚合函数aggregate时,如果需要match的属性是原生的ID的话,不能直接{_id:ID},虽然编译器不会报错,但是不会查询到任何内容,这里就需要使用mongoose.Types.ObjectId这个函数了。
注意在定义Schema的时候,ID是使用
type: mongoose.Schema.Types.ObjectId
来定义的,两者不要搞错了。
最终代码如下:
/**
* 根据目录ID和类型,获得随机数量的题目列表
* @param catalog
* @param type
* @param count
*/
findByCatalog(catalog:string, type:TQABankType, count:number) {
return Model.aggregate().match({ //
catalog:new mongoose.Types.ObjectId(catalog),
type
}).sample(count)
}
在js中是没有任何问题的,但是在ts中就会报错,可以看到match方法所接受的参数是
arg: mongoose.Expression | Record<string, mongoose.Expression>这样一个联合类型。
而mongoose.Types.ObjectId返回的是ObjectID类型,会提示
不能将类型“ObjectId”分配给类型“Expression”。ts(2322)
这里只能使用一个比较笨的办法,先定义一个unknown类型,然后强制转换成Expression类型即可。
最终的代码如下:
findByCatalog(catalog:string, type:TQABankType, count:number) {
const obj:unknown=new mongoose.Types.ObjectId(catalog)
return Model.aggregate().match({ //
catalog:obj as Expression,
type
}).sample(count)
}