PyMongo find() 使用 $or 和 $regex 进行查询

Ild*_*tov 3 mongodb pymongo

有一个 MongoDB 文档集合,其中包含有关书籍的信息。

我需要使用以下标准查找文档:

header包含子字符串)OR(author包含子字符串

在 mongo shell 中,我使用这个查询,它工作得很好

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

我无法让它在 PyMongo 中工作。

这是我的代码:

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

它什么也不返回。

我正在使用Python 3.7.0、PyMongo 3.7.1、MongoDB Server 3.2.11。

Olu*_*ule 6

/pattern/语法是用于创建正则表达式的 Javascript 文字语法。

在 Python 中,同样可以不使用正斜杠来编写。例如

search_request = {
    '$or':
        [
            {'author': {'$regex': f".*{search}.*", '$options': 'i'}},
            {'header': {'$regex': f".*{search}.*", '$options': 'i'}}
        ]
}
Run Code Online (Sandbox Code Playgroud)

如果您想惯用并创建一个正则表达式对象。您可以这样做,得到相同的结果:

import re

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

search_request = {
    '$or': [
            {'author': {'$regex': search_expr}},
            {'header': {'$regex': search_expr}}
     ]
}
Run Code Online (Sandbox Code Playgroud)