Я пытаюсь выполнить запрос регулярного выражения с помощью PyMongo на сервере MongoDB. Структура документа следующая
{
"files": [
"File 1",
"File 2",
"File 3",
"File 4"
],
"rootFolder": "/Location/Of/Files"
}
Я хочу получить все файлы, соответствующие шаблону * File. Я пробовал делать это как таковой
db.collectionName.find({'files':'/^File/'})
Но я ничего не получаю обратно. Я что-то упускаю, потому что, согласно документам MongoDB, это должно быть возможно? Если я выполняю запрос в консоли Mongo, он работает нормально, означает ли это, что API не поддерживает его, или я просто использую его неправильно?
Ответ 1 · рейтинг 200 · Eric
Если вы хотите включить параметры регулярного выражения (например, игнорировать регистр), попробуйте следующее:
import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})
Ответ 2 · рейтинг 160 · RC1140
Оказывается, поиск по регулярным выражениям в pymongo выполняется немного по-другому, но так же просто.
Регулярное выражение выполняется следующим образом:
db.collectionname.find({'files':{'$regex':'^File'}})
Это будет соответствовать всем документам, у которых есть свойство files, в котором есть элемент, начинающийся с File
Ответ 3 · рейтинг 11 · Keeely
Чтобы избежать двойной компиляции, вы можете использовать оболочку регулярных выражений bson, которая поставляется с 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, поскольку есть некоторые предостережения.
Ответ 4 · рейтинг 5 · Jeff
Решение re вообще не использует индекс. Вам следует использовать такие команды, как:
db.collectionname.find({'files':{'$regex':'^File'}})
(Я не могу комментировать их ответы, поэтому отвечаю здесь)