как использовать $ regex search в ссылочном поле в mongodb - PullRequest
0 голосов
/ 30 ноября 2018

Я борюсь с задачей, для которой я использовал две схемы

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,

}

Что ж, как я могу искать first_name, используя $ regex в Схеме сотрудника в этом поле, на которое ссылается пользователь?Я пытался во многих отношениях, не могу получить это.как я могу решить это?Заранее спасибо

1 Ответ

0 голосов
/ 30 ноября 2018

Первый подход:

Использование $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" }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...