Подтвердить что ты не робот

Запрос MongoDB (через pymongo) в случае нечувствительности

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

Проблема возникает, когда убедитесь, что два пользователя случайно не используют одно и то же имя пользователя, то есть в моей системе "randomUser" должно быть таким же, как "RandomUser" или "randomuser".

К сожалению (в данном случае), поскольку Mongo хранит строки как чувствительные к регистру, потенциально может быть несколько пользователей с "одинаковым" именем пользователя.

Мне известен метод запроса манго для нечувствительных к регистру строк:

db.stuff.find_one({"foo": /bar/i});

Однако это, похоже, не работает в моем методе запросов с использованием pymongo:

username = '/' + str(username) + '/i'
response = request.db['user'].find_one({"username":username},{"username":1})

Является ли это правильным способом структурирования запроса для pymongo (я предполагаю, что нет)?

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

4b9b3361

Ответ 1

PyMongo использует собственные регулярные выражения python, так же как оболочка mongo использует собственные регулярные выражения javascript. Чтобы написать эквивалентный запрос того, что вы написали в оболочке выше, вы должны использовать:

db.stuff.find_one({'name': re.compile(username, re.IGNORECASE)})

Обратите внимание, что это позволит избежать использования любого индекса, который может существовать в поле name. Общий шаблон для поиска или сортировки без учета регистра - это иметь второе поле в вашем документе, например name_lower, которое всегда устанавливается при изменении name (в версии с меньшим размером name, в этом случае). Затем вы запрашиваете такой документ, например:

db.stuff.find_one({'name_lower': username.lower()})