Поиск слов в монгоиде без учета регистра - PullRequest
11 голосов
/ 17 сентября 2011

Есть ли способ установить атрибут в mongoid для поиска без учета регистра?

Допустим, у кого-то есть имя пользователя: IAmGreat, и я хочу найти данные пользователей, используя их уникальное имя пользователя, без изменения и поменять их на iamgreat.

Спасибо

Ответы [ 5 ]

49 голосов
/ 10 апреля 2012

На самом деле вы можете искать без учета регистра.Но вы должны искать с помощью регулярного выражения!Вот пример того, как я использую его в http://www.VersionEye.com

User.first(conditions: {email: /^#{email}$/i})

С помощью "/" вы начинаете и заканчиваете регулярное выражение.«I» после регулярного выражения означает отсутствие учета регистра.«^» Означает, что элемент должен начинаться со строки поиска, а «$» означает, что элемент должен заканчиваться строкой поиска.Это важно, если вы ищете точное совпадение.

6 голосов
/ 13 апреля 2014

Вы даже можете попробовать что-то вроде:

User.where(username: /#{username}/i).first
4 голосов
/ 10 августа 2015

если вы используете рельсы или монгоид, вы можете попробовать ff:

@user = User.where({:username => /.*#{name}.*/i })

1 голос
/ 17 сентября 2011

Почему бы просто не уменьшить User.login.downcase (или какую-либо комбинацию вашей модели / атрибута) при сравнении?Это оставит заглавные буквы в БД как есть, но уменьшит поле только для сравнения.

0 голосов
/ 22 апреля 2018

Если вашему приложению не нужно хранить вводимые пользователем данные с учетом регистра, просто преобразуйте ввод в верхний или нижний регистр при входе. Пример,

username = params[:username].to_s.downcase

В противном случае, если производительность являетсяпроблема для вас (регулярное выражение без учета регистра не может использовать преимущества для индексов), правильный путь для этого - сохранить резервную копию поля для имени пользователя

field :username_downcase

, а затем выполнить запрос:

User.where(username_downcase: params[:username].to_s.downcase)
...