Выполнение запросов регулярного выражения с помощью pymongo
Я пытаюсь выполнить запрос регулярного выражения, используя pymongo против сервера mongodb. Структура документа следующая.
{ "files": [ "File 1", "File 2", "File 3", "File 4" ], "rootFolder": "/Location/Of/Files" }
Я хочу получить все файлы, соответствующие шаблону * Файл. Я пытался сделать это как таковой
db.collectionName.find({'files':'/^File/'})
Но я ничего не верну, я что-то пропустил, потому что, согласно документам mongodb, это должно быть возможно. Если я выполняю запрос в консоли mongo, он отлично работает, означает ли это, что api не поддерживает его, или я просто неправильно его использую
- mongo - не удалось подключиться к серверу 127.0.0.1:27017
- Можете ли вы указать ключ для $ addToSet в Монго?
- Создайте ISODate с pyMongo
Если вы хотите включить параметры регулярного выражения (например, игнорировать), попробуйте следующее:
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'}})
(Я не могу комментировать ниже их ответов, поэтому я отвечаю здесь)