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' kan inte tilldelas parameter av typ 'Promise'. Typen 'Aggregate' saknar följande egenskaper från typen 'Promise': [Symbol.toStringTag], finally*

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

Relaterade artiklar