使用 Typescript 进行 MongoDB 聚合

Faz*_*zal 9 aggregation mongodb node.js typescript

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

这是 getUser 函数的示例

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;
}
Run Code Online (Sandbox Code Playgroud)

我将其作为参数传递

const query = [
  {
     $match: {
        name:"Jon"
     }
  },
  {
    $project:{
      _id:1  
    }
  }
]
const userRes = await getUser(query);
Run Code Online (Sandbox Code Playgroud)

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

*(方法)模型<任何,任何,任何> .aggregate(管道?:任何[] |未定义):聚合<任何[]>(+1重载)

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

我尝试将 getUser 参数中的对象更改为任何数组或数组

这是错误的 SS在此输入图像描述

PS:我使用的是带有 typescript 的 Node,IDE 是 VSCode

Cod*_*0d3 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;
}
Run Code Online (Sandbox Code Playgroud)