2010-08-14 23 views
99

J'essaie d'effectuer une requête regex en utilisant pymongo par rapport à un serveur mongodb. La structure du document est la suivanteEffectuer des requêtes regex avec pymongo

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

Je veux obtenir tous les fichiers correspondant au motif * Fichier. J'ai essayé de le faire en tant que telle

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

Pourtant, je ne reçoivent rien de nouveau, suis-je manque quelque chose parce que, selon les documents MongoDB cela devrait être possible. Si j'effectue la requête dans la console mongo cela fonctionne bien, cela signifie-t-il que l'API ne le supporte pas ou est-ce que je l'utilise incorrectement

Répondre

117

Il s'avère que les recherches regex sont faites un peu différemment dans pymongo mais est aussi facile.

Regex se fait comme suit:

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

Cela correspondra à tous les documents qui ont un fichier propriété qui a un élément dans qui commence par fichier

+8

En fait, ce que vous avez ici est aussi [comme c'est fait en javascript] (http://docs.mongodb.org/manual/reference/operator/regex/) (et probablement d'autres langues aussi) si vous utilisez ' $ regex'. @ La réponse d'Eric est la façon python qui est un peu différente. – drevicko

+0

Quelle est la différence? Ils utilisent tous les deux python pymongo correct? Cela fait partie des requêtes de mongodb, donc je ne vois pas vraiment le problème. – Dexter

+5

Ignorecase est possible dans la regex de mongodb JScript aussi à savoir. db.collectionname.find ({'files': {'$ regex': '^ Fichier', '$ options': 'i'}}) –

143

Si vous voulez inclure des options d'expressions régulières (par exemple comme ignorer la casse), essayez ceci:

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

Notez aussi que les regex ancrées au début (ie: commençant par'^') sont capables d'utiliser index dans la DB, et fonctionnera beaucoup plus vite dans ce cas. – drevicko

+0

Regex commençant par^ne peut utiliser qu'un index dans [certains cas] (http://docs.mongodb.org/manual/reference/operator/query/regex/). Lors de l'utilisation de re.IGNORECASE, je crois que mongo ne peut pas utiliser un index pour effectuer la requête. – nonagon

+0

Cette utilisation est-elle documentée quelque part? Je ne peux pas le trouver dans le document officiel API 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) 

L'échappement du modèle avant la compilation gère tous les caractères.