更新时间:2023-01-16 07:43:14
第一种方法:
使用 $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" }}}
])
但这不是更好的方法,因为 Employee
文档,然后 $match
给用户firstName
会使查询速度变慢.
But it is not the better approach as the $lookup
stage is being applied to all the Employee
documents and then $match
to the users firstName
makes the query bit slow.
第二种方法:
首先使用$regex
查找具有firstName
等于匹配字符串的用户,然后在Employee
集合中找到_id
.
First find the users having firstName
equal to the match string using $regex
and then find the _id
in the Employee
collection.
const userIds = await (Users.find({ "firstName": { "$regex": your_string, "$options": "i" } })).map(user => user._id)
const employees = await Employee.find({ "user": { "$in": userIds }})
第三种方法:
在employee
架构中保持user
架构的单键firstName
Keep the single key firstName
of the user
schema in the employee
schema
员工架构
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" }
})