我目前正在创建一个python (金字塔)的网站,这需要用户注册和登录。系统允许用户选择用户名,可以是大写字母、小写字母和数字的混合。
当确保两个用户不会意外地共享相同的用户名时,问题就出现了,即在我的系统中,'randomuser‘应该与'randomUser’或'RandomUser‘相同。
不幸的是(在这种情况下),因为Mongo将字符串存储为区分大小写,所以可能会有许多用户使用相同的用户名。
我知道在mongo中查询不区分大小写的字符串的方法:
db.stuff.find_one({"foo": /bar/i});
然而,这在我使用pymongo的query方法中似乎不起作用:
username = '/' + str(username) + '/i'
response = request.db['user'].find_one({"username":username},{"username":1})
这是构建pymongo查询的正确方式吗(我想不是)?
只要创建或登录了用户帐户,就会使用此查询(因为它必须检查用户名是否存在于系统中)。我知道这不是最有效的查询,所以如果它只用于登录或帐户创建,那么它应该有关系吗?相反,更可取的做法是强制用户只选择小写用户名(完全不需要大小写敏感的查询)吗?
发布于 2011-06-08 01:24:01
PyMongo使用原生python正则表达式,就像mongo shell使用原生javascript正则表达式一样。要编写与您在上面的shell中编写的查询相同的查询,您可以使用:
db.stuff.find_one({'name': re.compile(username, re.IGNORECASE)})
但是请注意,这将避免使用name
字段上可能存在的任何索引。不区分大小写的搜索或排序的常见模式是在文档中有第二个字段,例如name_lower
,每当name
更改时都会设置该字段(在本例中,设置为name
的小写版本)。然后,您将查询如下所示的文档:
db.stuff.find_one({'name_lower': username.lower()})
发布于 2019-03-21 06:36:22
接受答案是危险的,它将匹配任何包含用户名的字符串!安全的选择是匹配精确的字符串:
import re
db.stuff.find_one({'name': re.compile('^' + username + '$', re.IGNORECASE)})
更安全的是,转义可能影响正则表达式匹配的任何特殊字符的变量:
import re
db.stuff.find_one({'name': re.compile('^' + re.escape(username) + '$', re.IGNORECASE)})
https://stackoverflow.com/questions/6266555
复制相似问题