@dotajax

Как в MongoDB через Mongoose устраивать поиск без учёта регистра?

Начинаю знакомство с Mongo. Делаю проверку занятости пользовательского имени в своей форме.

Есть модель:
const UserSchema = Schema({
  username: {
    type: String,
    required: 'Username is not specified'
    trim: true
  }
});

Поле username принимает в себя строку разного регистра, мне надо устраивать поиск имени (username) по базе в полном соответствии без строгости к регистру, к примеру так:

В базе данных есть пользователь с именем AlexPro, я ищу его по имени:
const username = 'AlexPRO'; // То, что хочу найти
const findByUsername = await User.findOne({ username }); // Ищу по базе, но я ничего не нахожу, так как символы разных регистров

Как игнорировать регистр?
  • Вопрос задан
  • 975 просмотров
Пригласить эксперта
Ответы на вопрос 2
0lorin
@0lorin
программист
Можно регуляркой:
await User.findOne({ username: {$regex: /AlexPRO/i} });

Но тогда он не будет использовать индекс (который, кстати, надо добавить).
А Вообще в таких случаях обычно приводят к нижнему регистру при сохранении.
const UserSchema = Schema({
  username: {
    type: String,
    required: 'Username is not specified',
    trim: true,

    index: true,
    lowercase: true,
  }
});
Ответ написан
@dotajax Автор вопроса
В общем, пришёл к такому решению:
const username = 'AlexPRO';

// если число, то преобразую в строку (чтобы не было ошибки с toLowerCase)
if (isNaN(username)) {
  // ...
}

// ищем логин с полной точностью, за исключением регистра
const user = await User.findOne({ username: new RexExp('^' + username + '$', 'i') });

if (findByUsername.length) {
  // ... response OK (200)
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы