Domanda

Sto tentando di eseguire una query regex usando pymongo su un server MongoDB. La struttura del documento è la seguente

{
  "files": [
    "File 1",
    "File 2",
    "File 3",
    "File 4"
  ],
  "rootFolder": "/Location/Of/Files"
}

Voglio ottenere tutti i file che corrispondono al modello * file. Ho provato a fare questo come ad esempio

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

Ancora mi rimetto niente, mi sto perdendo qualcosa perché, secondo la documentazione mongodb questo dovrebbe essere possibile. Se eseguo la query nella console Mongo che funziona bene, questo significa il supporto API doesnt o sono io solo usando in modo non corretto

È stato utile?

Soluzione 2

Si scopre che le ricerche regex sono fatto un po 'diverso in pymongo, ma è altrettanto facile.

Regex è fatto come segue:

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

Questa corrisponderà tutti i documenti che dispongono di una proprietà di file che ha un elemento all'interno che inizia con file

Altri suggerimenti

Se si desidera includere opzioni di espressioni regolari (come ad esempio ignorare caso), provate questo:

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

Al fine di evitare la doppia compilation è possibile utilizzare l'espressione regolare BSON wrapper che viene fornito con PyMongo:

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

Regex solo memorizza la stringa senza cercare di compilare, così find_one può quindi rilevare l'argomento come tipo di 'Regex' e formare la query Mongo appropriata.

mi sento in questo modo è un po 'più Pythonic rispetto agli altri top risposta, per esempio:.

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

E 'la pena di leggere sul BSON documentazione Regex se si prevede di utilizzare le query regex perché ci sono alcuni avvertimenti.

La soluzione di re non utilizza l'indice a tutti. Si dovrebbe usare i comandi come:

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

(non posso commento qui sotto le loro risposte, così rispondo qui)

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)

Evasione del modello prima di compilare le maniglie tutti i caratteri.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top