python - mongoclient - Consultar MongoDB(a través de pymongo) en caso de insensible eficiencia
pymongo mongoclient (1)
Actualmente estoy creando un sitio web en python (pirámide) que requiere que los usuarios se registren e inicien sesión. El sistema permite a los usuarios elegir un nombre de usuario que puede ser una mezcla de mayúsculas, minúsculas y números.
El problema surge al asegurarse de que dos usuarios no compartan accidentalmente el mismo nombre de usuario, es decir, en mi sistema ''randomUser'' debería ser el mismo que ''RandomUser'' o ''randomuser''.
Desafortunadamente (en este caso) debido a que Mongo almacena cadenas que distinguen entre mayúsculas y minúsculas, podría haber un número de usuarios con el mismo nombre de usuario.
Soy consciente del método de consulta de mongo para cadenas insensibles a mayúsculas y minúsculas:
db.stuff.find_one({"foo": /bar/i});
Sin embargo, esto no parece funcionar en mi método de consulta usando pymongo:
username = ''/'' + str(username) + ''/i''
response = request.db[''user''].find_one({"username":username},{"username":1})
¿Es esta la forma correcta de estructurar la consulta para pymongo (supongo que no)?
Esta consulta se utilizará siempre que se cree o inicie sesión en una cuenta de usuario (ya que tiene que comprobar si el nombre de usuario existe en el sistema). Sé que no es la consulta más eficiente, por lo tanto, ¿debería importar si solo se usa en los inicios de sesión o la creación de cuentas? ¿Es más deseable hacer algo como forzar a los usuarios a elegir solo nombres de usuarios en minúsculas (anulando la necesidad de consultas que no distinguen entre mayúsculas y minúsculas)?
PyMongo usa expresiones regulares nativas de python, de la misma manera que el shell mongo usa expresiones regulares nativas de javascript. Para escribir la consulta equivalente de lo que había escrito en el shell anterior, usaría:
db.stuff.find_one({''name'': re.compile(username, re.IGNORECASE)})
Tenga en cuenta que esto evitará el uso de cualquier índice que pueda existir en el campo de name
, sin embargo. Un patrón común para la búsqueda u ordenación que no distingue entre mayúsculas y minúsculas es tener un segundo campo en su documento, por ejemplo, name_lower
, que siempre se establece cada vez que el name
cambia (en este caso, a una versión con un name
de caja inferior). A continuación, debe consultar para un documento como:
db.stuff.find_one({''name_lower'': username.lower()})