node.js - 带有打字稿的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 参数中将对象更改为任何、数组或数组
PS:我正在使用带有打字稿的节点,IDE是VSCode
解决方案
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;
}
推荐阅读
- ruby-on-rails - Rails Tailwind 设置:模块构建失败(来自 ./node_modules/postcss-loader/src/index.js):
- google-identity - GoogleSignIn iOS SDK - 2021年谷歌登录期间什么时候会触发open url功能?
- java - Hibernate - 查找实体,其中包含另一个实体
- flutter - ChangeNotifier 属性不更新(Flutter2)
- flutter - 在操场上运行的 Graphql_flutter 突变在运行设备/模拟器上不起作用
- php - WooCommerce 管理员产品自定义复选框字段不保存价值
- wordpress - BuddyPress 通知列表锚标签 URL 设置错误
- oracle - Oracle 时间戳格式“DD-MON-RR HH.MI.SSXFF AM”中 X 的含义
- single-sign-on - 如何在 MS Teams 个人应用程序中配置 SSO 到 SAP Fiori 应用程序
- mysql - 如何在 GORM 上使用 mysql Union All?