pymongo:搜索字典OR操作

3
我正在尝试使用以下代码获取所有记录,其中"user_name"字段或"text"字段包含指定关键字,但看起来pymongo将操作视为AND,如何指定pymongo将其视为“OR”操作?
search_dict = {}

text_regex = ".*" + key + ".*";
text_reg = re.compile(text_regex,re.IGNORECASE)
search_dict["text"] = text_reg

user_name_regex = ".*" + key + ".*";
user_name_reg = re.compile(user_name_regex,re.IGNORECASE)
search_dict["user_name"] = user_name_reg

records = gLife_Article_Collection.find(search_dict)
2个回答

4

@qiao 是正确的,$or 语法正确,以下是完整示例:

import re
from pymongo import Connection
connection = Connection()
db = connection.test_database
db.regex_test.drop()

# Create some sample docs
db.regex_test.save({"user_name": "Rozza", "text": "Writing an example for Bin Chen based on qiao's answer"})
db.regex_test.save({"user_name": "qiao", "text": "Answering Bin Chen's question"})
db.regex_test.save({"user_name": "Bin Chen", "text": "Reading rozza's answer"})

# Do a regex $or query simple example
search_dict = {"$or": [
    {"user_name": {"$regex": "^Rozza"}}, 
    {"text": {"$regex": "rozza"}}
]}
assert db.regex_test.find(search_dict).count() == 2

# Do a regex $or query with re.compile
search_dict = {"$or": [
    {"user_name": re.compile("*.Rozza.*", re.IGNORECASE)}, 
    {"text": re.compile("*.Rozza.*", re.IGNORECASE)}
]}
assert db.regex_test.find(search_dict).count() == 2

非常感谢您的努力 :) - qiao
1
没问题!希望@Ben Chen会标记为已回答。这应该能帮助未来遇到正则表达式问题的其他人。 - Ross

1

你刚刚是在复制粘贴我上面的代码吗?我写错了,应该是 user_name 而不是 username。我已经修正了。 - qiao
不,我没有打错字,你的解决方案只是行不通……我不知道为什么。 - Bin Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接