【问题标题】:MongoDB aggregation with typescript带有打字稿的MongoDB聚合
【发布时间】:2021-08-25 11:24:48
【问题描述】:

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

这是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 函数上出现语法错误

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

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

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

这里是错误的SS

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

【问题讨论】:

  • 你能发布整个错误(格式正确)吗?还有你在这个 sn-p 中使用了哪些库?
  • @Max,我刚刚更新了问题

标签: node.js typescript mongodb aggregation


【解决方案1】:

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

【讨论】:

  • 感谢您的回复,我也试过了。不为我醒来
猜你喜欢
  • 2015-07-15
  • 2013-07-12
  • 2014-05-06
  • 2013-09-22
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
相关资源
最近更新 更多