Выполнение запросов Regex с Pymongo
Вопрос
Я пытаюсь выполнить запрос Regex, используя Pymongo на сервере MongoDB. Структура документов выглядит следующим образом
{
"files": [
"File 1",
"File 2",
"File 3",
"File 4"
],
"rootFolder": "/Location/Of/Files"
}
Я хочу получить все файлы, которые соответствуют шаблону * файл. Я пытался делать это как такое
db.collectionName.find({'files':'/^File/'})
И все же я ничего не получаю, я что-то упускаю, потому что в соответствии с документами MongoDB это должно быть возможно. Если я выполню запрос в консоли Mongo, он работает нормально, это означает, что API не поддерживает его или я просто использую его неправильно
Решение 2
Оказывается поиски Regex проводятся немного по-разному в Пимонго, но так же просто.
Regex выполняется следующим образом:
db.collectionname.find({'files':{'$regex':'^File'}})
Это будет соответствовать всем документам, имеющим свойство файлов, имеющих элемент в том, что начинается с файла
Другие советы
Если вы хотите включить варианты регулярного выражения (например, игнорировать случай), попробуйте следующее:
import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})
Чтобы избежать двойной компиляции, вы можете использовать обертку BSON REGEX, которая поставляется с Pymongo:
>>> regx = bson.regex.Regex('^foo')
>>> db.users.find_one({"files": regx})
Regex просто хранит строку, не пытаясь компилировать ее, поэтому Find_One может затем обнаружить аргумент в качестве типа «REGEX» и сформировать соответствующий запрос Mongo.
Я чувствую, что этот путь немного больше питон, чем другой лучший ответ, например:
>>> db.collectionname.find({'files':{'$regex':'^File'}})
Стоит читать на документации BSON Regex, если вы планируете использовать запросы Regex, потому что есть некоторые предостережения.
Решение re
Не использует индекс вообще. Вы должны использовать команды, такие как:
db.collectionname.find({'files':{'$regex':'^File'}})
(Я не могу прокомментировать ниже своих ответов, поэтому я отвечаю здесь)
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)
Устранение шаблона Перед компиляцией обрабатывает все символы.