pymongo:搜索字典或操作
我正在使用下面的代码,想要获取所有记录,这些记录的“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 个回答
1
特殊的关键字 $or
可以让你进行逻辑组合,具体内容可以查看官方的MongoDB文档:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or
search_dict = {'$or': [{'text': text_reg}, {'user_name': user_name_reg}]}
records = gLife_Article_Collections.find(search_dict)
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