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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top