mon goose поиск с использованием регулярных выражений на findbyid - PullRequest
0 голосов
/ 22 апреля 2020

Мне нужно найти пользователя по _id,

в его коллекции mongodb, в поиске которого нужно выполнить первые 5 символов в идентификаторе пользователя

, например, с 5e9cca я могу найти идентификатор коллекции 5e9cca24beabb96a4caedc35

    var id = req.body.id

    User.findById({ _id : { $regex: '^id', $options: 'i' } },  
     (err, user)  => {
        if (err) {
             console.log(err);
           res.status(400)
       }

с этим кодом, я получил эту ошибку:

MongooseError [CastError]: Cast to ObjectId failed for value "{ _id: { '$regex': '^id', '$options': 'i' } }" at path "_id" for model "User"

PS: поиск с использованием идентификатора отверстия работает

1 Ответ

2 голосов
/ 22 апреля 2020

Пн goose * .findById () примет строку и внутренне преобразует строку в ObjectId(). Таким образом, .findById() является своего рода оболочкой для нативной функции MongoDB .findOne(), и все, что она может сделать, это строка. Кроме того, вы не можете выполнять поиск по регулярному выражению в поле _id, так как оно не относится к типу string. Если вам это нужно, попробуйте:

В версии MongoDB> 4.0:

db.collection.aggregate([
  /** Create a field of type 'string' from `_id`*/
  { $addFields: { convertedId: { $toString: "$_id" } } },
  /** Regex search against it */
  {
    $match: {
      convertedId: {
        $regex: "^1a934e",
        $options: "i"
      }
    }
  },
  /** Remove additionally added field */
  { $project: { convertedId: 0 } }
])

Тест: mongoplayground

...