PyMongo find () запрос с $ или и $ regex - PullRequest
0 голосов
/ 24 августа 2018

Существует коллекция документов MongoDB, содержащая информацию о книгах.

Мне нужно найти документы по следующим критериям:

(header содержит подстрока ) ИЛИ (author содержит подстрока )

В оболочке mongo я использую этот запрос, и прекрасно работает :

db.books.find({$or: [{author: {$regex: /.*substring.*/i}}, {header: {$regex: /.*substring.*/i}}]})

НО Я не могу заставить его работать в PyMongo.

Вот мой код:

search = 'substring'
search_request = {
        '$or':
            [
                {'author': {'$regex': f"/.*{search}.*/", '$options': 'i'}},
                {'header': {'$regex': f"/.*{search}.*/", '$options': 'i'}}
            ]
    } 
cursor = self.books.find(search_request)

Он просто ничего не возвращает.

Я использую Python 3.7.0, PyMongo 3.7.1, MongoDB Server 3.2.11.

1 Ответ

0 голосов
/ 25 августа 2018

Синтаксис /pattern/ - это буквальный синтаксис Javascript для создания регулярных выражений.

В Python то же самое можно написать без косой черты. например,

search_request = {
    '$or':
        [
            {'author': {'$regex': f".*{search}.*", '$options': 'i'}},
            {'header': {'$regex': f".*{search}.*", '$options': 'i'}}
        ]
}

Если вы хотите быть идиоматичным и создать объект регулярного выражения. Вы можете сделать это с теми же результатами:

import re

search = "substring"
search_expr = re.compile(f".*{search}.*", re.I)

search_request = {
    '$or': [
            {'author': {'$regex': search_expr}},
            {'header': {'$regex': search_expr}}
     ]
}
...