Exécuter des requêtes avec pymongo regex
Question
Je suis en train d'effectuer une requête en utilisant regex pymongo contre un serveur MongoDB. La structure du document est la suivante
{
"files": [
"File 1",
"File 2",
"File 3",
"File 4"
],
"rootFolder": "/Location/Of/Files"
}
Je veux obtenir tous les fichiers qui correspondent au modèle * Fichier. J'ai essayé de le faire en tant que tel
db.collectionName.find({'files':'/^File/'})
Et pourtant, je reviens de rien, suis-je manque quelque chose parce que, selon les documents MongoDB cela devrait être possible. Si je Réalise la requête dans la console mongo il fonctionne très bien, ce que cela signifie le soutien ne marche pas api ou suis-je simplement l'utiliser de manière incorrecte
La solution 2
Turns des recherches sont effectuées regex peu différemment dans pymongo mais il est tout aussi facile.
Regex se fait comme suit:
db.collectionname.find({'files':{'$regex':'^File'}})
correspondra à tous les documents qui ont une propriété de fichiers qui a un élément dans commençant par fichier
Autres conseils
Si vous voulez inclure des options d'expressions régulières (par exemple ignorer la casse), essayez ceci:
import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})
Pour éviter la double compilation, vous pouvez utiliser l'expression rationnelle BSON wrapper qui vient avec PyMongo:
>>> regx = bson.regex.Regex('^foo')
>>> db.users.find_one({"files": regx})
Regex juste stocke la chaîne sans essayer de le compiler, de sorte find_one peut alors détecter l'argument comme un type « Regex » et former la requête appropriée Mongo.
Je me sens de cette façon est un peu plus Pythonic que l'autre haut réponse, par exemple:.
>>> db.collectionname.find({'files':{'$regex':'^File'}})
Il vaut la peine de lire sur la documentation BSON Regex si vous prévoyez d'utiliser des requêtes regex parce qu'il ya des mises en garde.
La solution de re
ne pas utiliser l'index du tout.
Vous devez utiliser des commandes telles que:
db.collectionname.find({'files':{'$regex':'^File'}})
(je ne peux pas faire de commentaires ci-dessous leurs réponses, donc je réponds ici)
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)
Échapper le modèle avant de compiler poignées tous les caractères.