node.js - MongoDB aggregering med TypeScript
Jag har en användarmodell och jag vill utföra generisk aggregering. Medelvärde vilken array av objekt jag än skickar till denna funktion så körs den.
detta är ett exempel på getUser-funktionen
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;
}
och jag skickar detta som en parameter
const query = [
{
$match: {
name:"Jon"
}
},
{
$project:{
_id:1
}
}
]
const userRes = await getUser(query);
Men jag kan inte köra programmet, det ger mig ett syntaxfel på getUser-funktionen
*(metod) Model<any, any, any>.aggregate(pipeline?: any[] | undefined): Aggregate<any[]> (+1 överlagring)
Argument av typ 'Aggregate
Jag försökte ändra objekt till any, Array eller Array i getUser-parameter
här är skärmdumpen av felet
PS: Jag använder Node med TypeScript och IDE är VSCode
Svar #1
Mongoose tillhandahåller PipelineStage-gränssnitt för pipes. Vi kan använda det direkt.
import { PipelineStage } from "mongoose";
public async getUser(aggregate: PipelineStage[]):
Promise<ResponseDTO> {
let response = {} as ResponseDTO;
const [err, user] = await User.aggregate(aggregate);
if (user) {
response = { success: true, data: user, message: "User found" };
}
else
response = { success: false, message: "User not found" };
return response;
}
Svar #2
Mongoose-frågor har sina egna typer, och du bör använda dessa typer för att undvika sådana fel.
Du kan importera dessa typer för vad du än behöver direkt från Mongoose-paketet.
Jag rekommenderar starkt att använda Typegoose-paketet, som hjälper till att skapa helt typade MongoDB-scheman, och därmed låter dig använda dessa typer som svar, hitta och uppdatera frågor och mycket mer! Referens: https://typegoose.github.io/typegoose/docs/guides/quick-start-guide
Exempel för ditt bruk med korrekt typ:
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;
}
