Первый подход:
Использование $lookup
агрегация
Employee.aggregate([
{ "$lookup": {
"from": "users",
"let": { "user": "$user" },
"pipeline": [
{ "$match": { "$expr": { "$eq": ["$_id", "$$user"] }}},
{ "$project": { "firstName": 1 }}
],
"as": "user"
}},
{ "$unwind": "$user" },
{ "$match": { "user.firstName": { "$regex": your_string, "$options": "i" }}}
])
Но это не лучшеподход в качестве этапа $lookup
применяется ко всем документам Employee
, а затем $match
для пользователей firstName
делает бит запроса медленным.
Второй подход:
Сначала найдите пользователей, у которых firstName
равна строке совпадения, с помощью $regex
, а затем найдите_id
в коллекции Employee
.
const userIds = await (Users.find({ "firstName": { "$regex": your_string, "$options": "i" } })).map(user => user._id)
const employees = await Employee.find({ "user": { "$in": userIds }})
Третий подход:
Сохраните один ключ firstName
схемы user
в employee
схема
схема сотрудника
user: { type: ObjectId, ref: 'User' },
gross_pay: String,
net_pay: String
tax: String
firstName: String
, а затем непосредственно использовать запрос
const userIds = await Employee.find({
"firstName": { "$regex": your_string, "$options": "i" }
})