Выполнение запросов регулярного выражения с помощью pymongo

Я пытаюсь выполнить запрос регулярного выражения, используя pymongo против сервера mongodb. Структура документа следующая.

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

Я хочу получить все файлы, соответствующие шаблону * Файл. Я пытался сделать это как таковой

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

Но я ничего не верну, я что-то пропустил, потому что, согласно документам mongodb, это должно быть возможно. Если я выполняю запрос в консоли mongo, он отлично работает, означает ли это, что api не поддерживает его, или я просто неправильно его использую

    Если вы хотите включить параметры регулярного выражения (например, игнорировать), попробуйте следующее:

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

    Оказывается, поиск регулярных выражений выполняется несколько иначе в pymongo, но так же просто.

    Regex выполняется следующим образом:

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

    Это будет соответствовать всем документам, у которых есть свойство файлов, в котором есть элемент внутри, который начинается с файла

    Чтобы избежать двойной компиляции, вы можете использовать оболочку regex bson, которая поставляется вместе с PyMongo:

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

    Regex просто сохраняет строку, не пытаясь ее скомпилировать, поэтому find_one может затем определить аргумент как тип «Regex» и сформировать соответствующий запрос Mongo.

    Я чувствую, что этот путь немного более Pythonic, чем другой верхний ответ, например:

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

    Стоит прочитать в документации bson Regex, если вы планируете использовать регулярные запросы, потому что есть некоторые оговорки.

     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) 

    Выключение шаблона перед компиляцией обрабатывает все символы.

    Решение re не использует индекс вообще. Вы должны использовать команды типа:

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

    (Я не могу комментировать ниже их ответов, поэтому я отвечаю здесь)

    Давайте будем гением компьютера.