Home > Blockchain >  Mongodb/Mongoose types aggregation incompatibility
Mongodb/Mongoose types aggregation incompatibility

Time:04-09

After migrating nodejs server to a newer version of mongoose, I encountered a weird typescript error referring to $sort aggregation.

My versions

dependencies "mongoose": "^6.2.10",

Dev dependencies "@types/mongoose": "^5.11.97", "typescript": "^4.6.3"

I simplify code.

export const timetableTest = (group: string): Promise<IGroupTimetableEvents[]> => {
    const agg = [{ $match: { group } }, { $sort: { reference: 1 } }];
    const result = GroupEvent.aggregate(agg).exec();
    return result;
};

GroupEvent.aggregate(agg) does not accept agg variable, I see the following message.

Argument of type '({ $match: { group: string; }; $sort?: undefined; } | { $sort: { reference: number; }; $match?: undefined; })[]' is not assignable to parameter of type 'PipelineStage[]'. Type '{ $match: { group: string; }; $sort?: undefined; } | { $sort: { reference: number; }; $match?: undefined; }' is not assignable to type 'PipelineStage'. Type '{ $sort: { reference: number; }; $match?: undefined; }' is not assignable to type 'PipelineStage'. Type '{ $sort: { reference: number; }; $match?: undefined; }' is not assignable to type 'Sort'. Types of property '$sort' are incompatible. Type '{ reference: number; }' is not assignable to type 'Record<string, 1 | -1 | { $meta: "textScore"; }>'. Property 'reference' is incompatible with index signature. Type 'number' is not assignable to type '1 | -1 | { $meta: "textScore"; }'.ts(2345)

I see the issue is coming from TS, nevertheless, I provide 1 (number) which looks like is not accepted.

Type 'number' is not assignable to type '1 | -1 | { $meta: "textScore"; }'

Before migration, I did not encounter this error and compilation/code execution was fine.

Please, let me know what am I am missing.

CodePudding user response:

I'm currently facing the same issue and as a workaround I came up with this:

const sort: Record<string, | 1 | -1 | {$meta: "textScore"}> = { reference: 1 };

export const timetableTest = (group: string): Promise<IGroupTimetableEvents[]> => {
    const agg = [{ $match: { group } }, { $sort: sort }];
    const result = GroupEvent.aggregate(agg).exec();
    return result;
};
  • Related