我正在为一项任务而苦苦挣扎,因为我使用了两种模式
User Schema
{
"first_name": String,
"last_name":String,
"address": String
}
Employee schema
{
user:{
type: ObjectId,
ref: 'User'
},
gross_pay: String,
net_pay: String
tax: String,
}
那么,如何在此用户引用字段的Employee Schema中使用$ regex搜索first_name?我尝试了很多方法,无法做到。我该如何解决?预先感谢
答案 0 :(得分:1)
第一种方法:
使用$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" }
})
答案 1 :(得分:0)
您可以使用$regex
运算符
语法:
{ <field>: { $regex: /pattern/, $options: '<options>' } }
示例:
{first_name : { $regex: /kapil.*/, $options: 'i'}}
有关更多详细信息,请参见mongo docs