I have \'jobs\' and \'users\' collection. Every user can create a job for given \'jobCategoryId\', that job is then saved in \'jobs\' collection and contains \'userId\' of it\'s
This is from the syntax of arrayElemAt
The expression can be any valid expression as long as it resolves to an array.
Which means you can construct your array elements however you want. In your case you want only the name. So this should work:
[{
$match: {
jobCategoryId: mongoose.Types.ObjectId(jobCategoryId)
}
}, {
$lookup: {
from: 'users',
localField: 'userId',
foreignField: '_id',
as: 'user'
}
}, {
$project: {
_id: 1,
description: 1,
title: 1,
user: {
name: {
$arrayElemAt: ["$user.name", 0]
}
}
}
}]
Follow up UPDATE:
it was asked how to additional properties on top of name
. Here is the project:
{
$project: {
_id: 1,
description: 1,
title: 1,
user: {
name: {
$arrayElemAt: ["$user.name", 0]
},
email: {
$arrayElemAt: ["$user.email", 0]
}
}
}
}
Second follow up as Drag0 asked in the comments: If the above isn't good enough because the results generate a user:[] array of size 1 instead of an object user:{} the following can be used.
{
$project: {
_id: 1,
description: 1,
title: 1,
user: {
$let: {
vars: {
firstUser: {
$arrayElemAt: ["$user", 0]
}
},
in: {
name: "$$firstUser.name",
email: "$$firstUser.email"
}
}
}
}
}