Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在mongodb中的引用字段中使用$regex搜索_Node.js_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

Node.js 如何在mongodb中的引用字段中使用$regex搜索

Node.js 如何在mongodb中的引用字段中使用$regex搜索,node.js,mongodb,mongoose,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我正在努力完成一项任务,我使用了两种模式 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, } 那么,在这个用户引用的字段中,如

我正在努力完成一项任务,我使用了两种模式

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,

}

那么,在这个用户引用的字段中,如何在员工模式中使用$regex搜索first_name呢?我试了很多方法,但都没能成功。我如何解决它?提前感谢

第一种方法:

使用聚合

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
文档,然后应用于用户
firstName
使得查询有点慢

第二种方法:

首先使用
$regex
查找名
firstName
等于匹配字符串的用户,然后在
Employee
集合中查找
\u id

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

员工模式

  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" }
})