Выполнение запросов регулярного выражения с помощью 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'}})

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

    Interesting Posts

    Угловой UI-маршрутизатор – вложенные состояния с несколькими макетами

    Как настроить маршрутизатор интрасети для информирования своих хостов о маршрутах в другие подсети?

    Создать имя 8.3 для существующего каталога

    Как я могу защитить свои сборки .NET от декомпиляции?

    ES6 – преобразовать из ‘require’ в ‘import’

    Как вы выполняете бикубическую (или другую нелинейную) интерполяцию передискретизированных аудиоданных?

    Как избежать одиночной цитаты внутри awk

    Установка тега заголовка ID3 равным имени файла MP3

    Открытый оператор new, частный оператор delete: получение C2248 «не может получить доступ к частному пользователю» при использовании нового

    Мониторинг полосы пропускания в персональной сети

    C ++ 11 std :: mutex в тупике Visual Studio 2012 при блокировке из DllMain ()

    Управление штриховой длиной штриха и расстоянием между штрихами

    Как закрыть приложения Mac OS X после закрытия последнего окна

    Android: не может заменить один fragment другим

    Пользовательские разрешения: Daemon и User

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