J'essaye d'effectuer une requête regex en utilisant 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 * File. J'ai essayé de faire ça comme tel
db.collectionName.find({'files':'/^File/'})
Pourtant, je ne reçois rien en retour, est-ce que je manque quelque chose parce que selon la documentation de mongodb cela devrait être possible. Si j'exécute la requête dans la console mongo, cela fonctionne correctement, cela signifie-t-il que l'api ne le prend pas en charge ou est-ce que je l'utilise simplement de manière incorrecte?
^
) peuvent utiliser des index dans la base de données, et fonctionneront beaucoup plus rapidement dans ce cas.Il s'avère que les recherches regex sont effectuées un peu différemment dans pymongo, mais elles sont tout aussi faciles.
Regex se fait comme suit:
Cela correspondra à tous les documents dont la propriété files contient un élément commençant par File
la source
$regex
. La réponse de @ Eric est la manière python qui est un peu différente.$regex
opérateur de Mongo prend un$options
argument.r'^File'
place de'^File'
pour éviter tout autre problèmePour éviter la double compilation, vous pouvez utiliser le wrapper bson regex fourni avec PyMongo:
Regex stocke simplement la chaîne sans essayer de la compiler, donc find_one peut alors détecter l'argument comme un type 'Regex' et former la requête Mongo appropriée.
Je pense que cette façon est légèrement plus pythonique que l'autre réponse principale, par exemple:
Cela vaut la peine de lire la documentation de bson Regex si vous prévoyez d'utiliser des requêtes regex car il y a quelques mises en garde.
la source
bson.regex.Regex
fera l'affaire!La solution de
re
n'utilise pas du tout l'index. Vous devriez utiliser des commandes comme:db.collectionname.find({'files':{'$regex':'^File'}})
(Je ne peux pas commenter ci-dessous leurs réponses, donc je réponds ici)
la source