2010-08-14 25 views
99

Estoy intentando realizar una consulta de expresiones regulares utilizando pymongo en un servidor mongodb. La estructura del documento es la siguienteRealización de consultas de expresiones regulares con pymongo

{ 
    "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. He intentado hacer esto como tal

db.collectionName.find({'files':'/^File/'}) 

embargo puedo obtener nada a cambio, me estoy perdiendo algo, porque de acuerdo a la documentación 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?

Respuesta

117

Resulta que las búsquedas de expresiones regulares se realizan de forma diferente en Pymongo pero es igual de fácil.

expresión regular se realiza de la siguiente manera:

db.collectionname.find({'files':{'$regex':'^File'}}) 

Esto corresponderá con todos los documentos que tienen una propiedad archivos que tiene un artículo en el plazo que se inicia con el archivo

+8

En realidad, lo que tienes aquí también es la [forma en que se hace en javascript] (http://docs.mongodb.org/manual/reference/operator/regex/) (y probablemente en otros idiomas también) si usas ' $ regex'. La respuesta de @ Eric es la forma de python que es un poco diferente. – drevicko

+0

¿cuál es la diferencia? Ambos usan python pymongo correctamente? Es parte de las consultas de mongodb, así que no veo el problema realmente. – Dexter

+5

Ignorecase es posible en regex de mongodb JScript también a saber. db.collectionname.find ({'files': {'$ regex': '^ File', '$ options': 'i'}}) –

143

Si desea incluir opciones de expresiones regulares (tales como ignorar el caso), intente esto:

import re 
regx = re.compile("^foo", re.IGNORECASE) 
db.users.find_one({"files": regx}) 
+5

Tenga en cuenta también que las expresiones regulares ancladas al inicio (es decir, que comienzan con'^') pueden usarse índices en el db, y se ejecutará mucho más rápido en ese caso. – drevicko

+0

Regex que comienza con^solo puede usar un índice en [ciertos casos] (http://docs.mongodb.org/manual/reference/operator/query/regex/). Cuando uso re.IGNORECASE, creo que mongo no puede usar un índice para realizar la consulta. – nonagon

+0

¿Este uso está documentado en alguna parte? No puedo encontrar esto en el documento oficial de API de Pymongo. – Hieu

0
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 la compilación se manejan todos los caracteres.

Cuestiones relacionadas