Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Выполнение запросов регулярных выражений с PyMongo

Автор вопроса: RC1140Ответов: 4

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

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

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

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

Но я ничего не получаю обратно. Я что-то упускаю, потому что, согласно документам MongoDB, это должно быть возможно? Если я выполняю запрос в консоли Mongo, он работает нормально, означает ли это, что API не поддерживает его, или я просто использую его неправильно?

mongodbpymongo

Ответы

Ответ 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'}})

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы