且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间: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" }
})