首页 > 解决方案 > 带有打字稿的MongoDB聚合

问题描述

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

这是 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;
}

我把它作为参数传递

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

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

*(方法) Model<any, any, any>.aggregate(pipeline?: any[] | undefined): Aggregate<any[]> (+1 重载)

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

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

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

PS:我正在使用带有打字稿的节点,IDE是VSCode

标签: node.jstypescriptmongodbaggregation

解决方案


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

推荐阅读