Pregunta

Estoy intentando realizar una consulta de expresiones regulares usando 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 conseguir todos los archivos que coinciden con el patrón * Archivo. He intentado hacer esto como tal

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

Sin embargo, puedo volver nada, me estoy perdiendo algo, porque de acuerdo a la documentación mongodb esto debería ser posible. Si realizo la consulta en la consola mongo funciona bien, ¿significa esto el apoyo api duerma o solo estoy usando de manera incorrecta

¿Fue útil?

Solución 2

resulta búsquedas de expresiones regulares se llevan a cabo de manera diferente en pymongo pero es igual de fácil.

Regex 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 Archivo

Otros consejos

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

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

Para evitar la doble compilación puede utilizar la expresión regular BSON envoltorio que viene con PyMongo:

>>> regx = bson.regex.Regex('^foo')
>>> db.users.find_one({"files": regx})

Regex simplemente almacena la cadena sin tratar de compilarlo, por lo find_one entonces puede detectar el argumento como un tipo de 'expresiones regulares' y formar la consulta Mongo apropiado.

me siento de esta manera es un poco más que el otro Pythonic respuesta más común, por ejemplo:.

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

Vale la pena leer sobre la documentación Regex BSON si va a utilizar consultas de expresiones regulares porque hay algunas advertencias.

La solución de re no utiliza el índice en absoluto. Debe utilizar comandos como:

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

(no puedo comentar por debajo de sus respuestas, por lo que contesto aquí)

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)

Escapar el patrón antes de compilar las manijas todos los caracteres.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top