Вопрос

Я пытаюсь выполнить запрос 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)

Устранение шаблона Перед компиляцией обрабатывает все символы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top