Как правильно отфильтровать данные в MongoDB? [поиск по тексту в нескольких полях]

Всем привет, подскажите, пожалуйста, как правильно сделать следующую фильтрацию в MongoDB?

У меня есть три документа.

    "_id": {
        "$oid": "5d7f70d46b647c1a74d9b8aa"
    },
    "firstName": "user",
    "lastName": "one",
    "phoneNumber": "+7 (111) 111-11-11",
    "city": "Москва",
    "userId": {
        "$oid": "5d5ea4596886b1107c2be849"
    },
    "__v": 0
}


{
    "_id": {
        "$oid": "5d7f70d46b647c1a74d9b8aa"
    },
    "firstName": "user",
    "lastName": "two",
    "phoneNumber": "+7 (222) 222-22-22",
    "city": "Сочи",
    "userId": {
        "$oid": "5d5ea4596886b1107c2be849"
    },
    "__v": 0
}


{
    "_id": {
        "$oid": "5d7f70d46b647c1a74d9b8aa"
    },
    "firstName": "user",
    "lastName": "two",
    "phoneNumber": "+7 (333) 333-33-33",
    "city": "Москва",
    "userId": {
        "$oid": "5d5ea4596886b1107c2be849"
    },
    "__v": 0
}

На вход у меня приходит, например такой массив:
['ne', 'чи']
Ожидается результат поиска по всем документам и следующим полям в этих документах: [‘firstName’, ‘lastName’, ‘phoneNumber’, ‘city’]
Очевидно, в дальнейшем эти поля могут изменяться: либо поиск только по ‘city’, либо же только по ‘firstName’ и ‘lastName’

Результат:

    "_id": {
        "$oid": "5d7f70d46b647c1a74d9b8aa"
    },
    "firstName": "user",
    "lastName": "one",
    "phoneNumber": "+7 (111) 111-11-11",
    "city": "Москва",
    "userId": {
        "$oid": "5d5ea4596886b1107c2be849"
    },
    "__v": 0
}


{
    "_id": {
        "$oid": "5d7f70d46b647c1a74d9b8aa"
    },
    "firstName": "user",
    "lastName": "two",
    "phoneNumber": "+7 (222) 222-22-22",
    "city": "Сочи",
    "userId": {
        "$oid": "5d5ea4596886b1107c2be849"
    },
    "__v": 0
}

Модель выглядит следующим образом:


const bookSchema = new Schema({
  firstName: {
    type: String,
    required: true
  },
  lastName: {
    type: String,
    required: true
  },
  city: {
    type: String,
    required: true
  },
  phoneNumber: {
    type: String,
    required: true
  },
  userId: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  }
})

module.exports = model('Book', bookSchema)

контроллер:

  console.log(req.body) // ['ne', 'чи']

  // just an example of a simple search
  // Book.find({
  //   lastName: 'one'
  // })
  //   .then(book => {
  //     console.log('book', book)
  //   })
  //   .catch(err => {
  //     if (!err.statusCode) {
  //       err.statusCode = 500
  //     }
  //     next(err)
  //   })
}

Моя попытка реализовать эту задачу. Проблема в том, что корректно будет искать, только если на вход будет приходить слово без пробелов: ‘со’.
Задача же работать с чем-то вроде этого ‘со tw’

  console.log(req.body) // ['ne', 'чи']

  const term = req.body.join(' ')
  console.log(term)

  Book.aggregate([
    {
      $match: {
        $or: [
          {
            firstName: {
              '$regex': term, //  'чи'
              '$options': 'i'
            }
          },
          {
            lastName: {
              '$regex': term,
              '$options': 'i'
            }
          },
          {
            city: {
              '$regex': term,
              '$options': 'i'
            }
          },
          {
            phoneNumber: {
              '$regex': term,
              '$options': 'i'
            }
          }
        ]
      }
    }
  ])
    .then(book => {
      console.log('book', book)
    })
    .catch(err => {
      if (!err.statusCode) {
        err.statusCode = 500
      }
      next(err)
    })
}

Для этого случая нужно искать “со tw” в каждом из полей, или “co” в каждом из полей и “tw” в каждом из полей?

Можно пример, пожалуйста. Не могу сказать, что у меня большой опыт в MongoDB, те варианты, которые я пробовал, включая эту идею, возвращали, не то, что я ожидал. Очевидно, что я делал, что-то не так. Поэтому буду признателен, если не сложно, либо ссылке на нужную часть документации, либо “нескольким” правильным строкам кода. Плюс, к тому же, здесь надо понимать, что может быть вот такая строка ‘co tw’, а может быть и ‘co tw on ome s’ в общем произвольно, зависит от того, что введет пользователь.

$text $search

1 Симпатия

Спасибо.