首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >高效查询大小写不敏感的MongoDB (通过pymongo实现)

高效查询大小写不敏感的MongoDB (通过pymongo实现)
EN

Stack Overflow用户
提问于 2011-06-07 22:14:54
回答 2查看 17.2K关注 0票数 24

我目前正在创建一个python (金字塔)的网站,这需要用户注册和登录。系统允许用户选择用户名,可以是大写字母、小写字母和数字的混合。

当确保两个用户不会意外地共享相同的用户名时,问题就出现了,即在我的系统中,'randomuser‘应该与'randomUser’或'RandomUser‘相同。

不幸的是(在这种情况下),因为Mongo将字符串存储为区分大小写,所以可能会有许多用户使用相同的用户名。

我知道在mongo中查询不区分大小写的字符串的方法:

代码语言:javascript
复制
db.stuff.find_one({"foo": /bar/i});

然而,这在我使用pymongo的query方法中似乎不起作用:

代码语言:javascript
复制
username = '/' + str(username) + '/i'
response = request.db['user'].find_one({"username":username},{"username":1})

这是构建pymongo查询的正确方式吗(我想不是)?

只要创建或登录了用户帐户,就会使用此查询(因为它必须检查用户名是否存在于系统中)。我知道这不是最有效的查询,所以如果它只用于登录或帐户创建,那么它应该有关系吗?相反,更可取的做法是强制用户只选择小写用户名(完全不需要大小写敏感的查询)吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-08 01:24:01

PyMongo使用原生python正则表达式,就像mongo shell使用原生javascript正则表达式一样。要编写与您在上面的shell中编写的查询相同的查询,您可以使用:

代码语言:javascript
复制
db.stuff.find_one({'name': re.compile(username, re.IGNORECASE)})

但是请注意,这将避免使用name字段上可能存在的任何索引。不区分大小写的搜索或排序的常见模式是在文档中有第二个字段,例如name_lower,每当name更改时都会设置该字段(在本例中,设置为name的小写版本)。然后,您将查询如下所示的文档:

代码语言:javascript
复制
db.stuff.find_one({'name_lower': username.lower()})
票数 51
EN

Stack Overflow用户

发布于 2019-03-21 06:36:22

接受答案是危险的,它将匹配任何包含用户名的字符串!安全的选择是匹配精确的字符串:

代码语言:javascript
复制
import re
db.stuff.find_one({'name': re.compile('^' + username + '$', re.IGNORECASE)})

更安全的是,转义可能影响正则表达式匹配的任何特殊字符的变量:

代码语言:javascript
复制
import re
db.stuff.find_one({'name': re.compile('^' + re.escape(username) + '$', re.IGNORECASE)}) 
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6266555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档