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

时间:2018-08-24 13:04:59

标签: mongodb pymongo

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

我需要使用以下条件查找文档:

header包含 substring )或(author包含 substring

在mongo shell中,我正在使用此查询,并且它工作得很好

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 :(得分:1)

/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}}
     ]
}