使用打字稿进行 MongoDB 聚合

时间:2021-06-08 13:01:18

标签: node.js typescript mongodb aggregation

我有一个 User 模型,我想执行通用聚合。表示我传递给它执行的函数的任何对象数组。

这是getUser函数的示例

ROW

我把它作为参数传递

public async getUser(aggregate: object): Promise<ResponseDTO> {
     let response = {} as ResponseDTO;
     const [err, user] = await To(User.aggregate(aggregate));
     if (user) {
         response = { success: true, data: user, message: "User fround" };
     }
     else
         response = { success: false, message: "User not fround" };
     return response;
}

但是我无法运行该程序,它在 getUser 函数上给了我语法错误

*(method) Model.aggregate(pipeline?: any[] | undefined): Aggregate (+1 重载)

“Aggregate”类型的参数不可分配给“Promise”类型的参数。 “Aggregate”类型缺少“Promise”类型中的以下属性:[Symbol.toStringTag],finally*

我试图在 getUser 参数中将对象更改为任何、数组或数组

这是错误 enter image description here 的 SS

PS:我使用 node 和 typescript,IDE 是 VSCode

1 个答案:

答案 0 :(得分:0)

Mongoose 查询有自己的类型,您应该使用这些类型来避免此类错误。

您可以直接从 Mongoose 包中为您需要的任何内容导入这些类型。

我强烈推荐使用 Typegoose 包,它有助于创建完全类型化的 MongoDB 模式。并允许您使用这些类型作为响应,查找和更新查询等等! 参考: https://typegoose.github.io/typegoose/docs/guides/quick-start-guide

使用正确类型的示例:

import { FilterQuery } from 'mongoose';

public async getUser(aggregate: FilterQuery<ResponseDTO>): Promise<ResponseDTO> {
     let response = {} as ResponseDTO;
     const [err, user] = await To(User.aggregate(aggregate));
     if (user) {
         response = { success: true, data: user, message: "User fround" };
     }
     else
         response = { success: false, message: "User not fround" };
     return response;
}