有一个 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。
该/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)