I have written a shell query which works perfectly on mongo shell but is not returning any value when run using mongoose in nodejs + typescript;
Mongo shell
db.userworks.aggregate([ { $match: { user: ObjectId("607dfc9fd1ae095014ab57a0"), workspace: ObjectId("607dfca7d1ae095014ab57a1"), }, }, { $project: { _id: 0, }, }, { $lookup: { from: 'workspaces', localField: 'workspace', foreignField: '_id', as: 'workspaces', }, }, { $unwind: '$workspaces', }, { $lookup: { from: 'projects', localField: 'workspaces.projects', foreignField: '_id', as: 'projects', }, }, { $unwind: '$projects', }, { $project: { projects: 1, }, }, { $replaceRoot: { newRoot: '$projects' } }, { $sort: { 'projects.createdAt': -1, }, }, ]).pretty()
But when I run the same query using mongoose in one of my routes.
Mongoose :
const projects = await UserWorks.aggregate([ { $match: { user: '607dfc9fd1ae095014ab57a0', workspace: '607dfca7d1ae095014ab57a1', }, }, { $project: { _id: 0, }, }, { $lookup: { from: 'workspaces', localField: 'workspace', foreignField: '_id', as: 'workspaces', }, }, { $unwind: '$workspaces', }, { $lookup: { from: 'projects', localField: 'workspaces.projects', foreignField: '_id', as: 'projects', }, }, { $unwind: '$projects', }, { $project: { projects: 1, }, }, { $replaceRoot: { newRoot: '$projects' } }, { $sort: { 'projects.createdAt': -1, }, }, ])
I would really appreciate if someone could help me with this. Because it took me a while to make this query on shell.
Advertisement
Answer
You can’t compare ObjectId and String.
you have to convert it ObjectId
mongoose.Types.ObjectId('607dfc9fd1ae095014ab57a0')
{ $match: { user: mongoose.Types.ObjectId('607dfc9fd1ae095014ab57a0') , workspace: mongoose.Types.ObjectId('607dfca7d1ae095014ab57a1'), }, },