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

时间:2018-11-30 05:22:26

标签: 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,

}

那么,如何在此用户引用字段的Employee Schema中使用$ regex搜索first_name?我尝试了很多方法,无法做到。我该如何解决?预先感谢

2 个答案:

答案 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