第一种方法:
使用$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 使得查询有点慢。
第二种方法:
首先使用$regex找到firstName等于匹配字符串的用户,然后在Employee集合中找到_id。
const userIds = await (Users.find({ "firstName": { "$regex": your_string, "$options": "i" } })).map(user => user._id)
const employees = await Employee.find({ "user": { "$in": userIds }})
第三种方法:
将user 架构的单个键firstName 保留在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" }
})