ts开发中mongoose使用聚合查询中ObjectId的问题

 0 0条评论

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)
    }

本文作者:双黑

版权声明:本站文章欢迎链接分享,禁止全文转载!

游客