por - expresiones regulares mongodb
Realizando consultas regex con pymongo (4)
Estoy tratando de realizar una consulta de expresiones regulares utilizando pymongo contra un servidor mongodb. La estructura del documento es la siguiente
{
"files": [
"File 1",
"File 2",
"File 3",
"File 4"
],
"rootFolder": "/Location/Of/Files"
}
Quiero obtener todos los archivos que coinciden con el patrón * Archivo. Intenté hacer esto como tal
db.collectionName.find({''files'':''/^File/''})
Sin embargo, no recibo nada, me falta algo porque según los documentos de mongodb esto debería ser posible. Si realizo la consulta en la consola de mongo, funciona bien, ¿significa que la API no la admite o simplemente la uso incorrectamente?
Para evitar la compilación doble, puede usar el contenedor bong regex que viene con PyMongo:
>>> regx = bson.regex.Regex(''^foo'')
>>> db.users.find_one({"files": regx})
Regex simplemente almacena la cadena sin intentar compilarla, por lo que find_one puede detectar el argumento como un tipo ''Regex'' y formar la consulta de Mongo apropiada.
Siento que esta manera es un poco más pitonica que la otra respuesta superior, por ejemplo:
>>> db.collectionname.find({''files'':{''$regex'':''^File''}})
Vale la pena leer en la documentación de Regex bson si planea usar consultas de expresiones regulares porque hay algunas advertencias.
Resulta que las búsquedas de expresiones regulares se realizan de forma un poco diferente en Pymongo, pero es igual de fácil.
Regex se hace de la siguiente manera:
db.collectionname.find({''files'':{''$regex'':''^File''}})
Esto coincidirá con todos los documentos que tienen una propiedad de archivos que tiene un elemento dentro que comienza con el archivo
Si desea incluir opciones de expresiones regulares (como ignorar mayúsculas y minúsculas), intente esto:
import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})
import re
def get_pattern_query(pattern,starting_with=False,ending_with=False,ignore_case=False):
start = ''^'' if starting_with else ''.*''
end = ''$'' if ending_with else ''.*''
pattern = start + re.escape(pattern) + end
return re.compile(pattern, re.IGNORECASE) if ignore_case else re.compile(pattern)
Al escapar del patrón antes de compilar se manejan todos los caracteres.